summaryrefslogtreecommitdiffstats
path: root/block/sed-opal.c
diff options
context:
space:
mode:
authorDavid Kozub <zub@linux.fjfi.cvut.cz>2019-02-13 19:16:04 -0500
committerJens Axboe <axboe@kernel.dk>2019-04-06 13:09:13 -0400
commit3fff234b851cf7cd638efea658e9cbcf33c3a691 (patch)
tree2d9848260d175a02d3af7be17713fd13c80de105 /block/sed-opal.c
parenta4ddbd1b7b2cf5d18f34fdf8ddbb539f4c307564 (diff)
block: sed-opal: unify retrieval of table columns
Instead of having multiple places defining the same argument list to get a specific column of a sed-opal table, provide a generic version and call it from those functions. Co-authored-by: David Kozub <zub@linux.fjfi.cvut.cz> Signed-off-by: Jonas Rabenstein <jonas.rabenstein@studium.uni-erlangen.de> Signed-off-by: David Kozub <zub@linux.fjfi.cvut.cz> Reviewed-by: Scott Bauer <sbauer@plzdonthack.me> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jon Derrick <jonathan.derrick@intel.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/sed-opal.c')
-rw-r--r--block/sed-opal.c130
1 files changed, 47 insertions, 83 deletions
diff --git a/block/sed-opal.c b/block/sed-opal.c
index 7f02e50e2bce..5395ab1c5248 100644
--- a/block/sed-opal.c
+++ b/block/sed-opal.c
@@ -1075,6 +1075,37 @@ static int finalize_and_send(struct opal_dev *dev, cont_fn cont)
1075 return opal_send_recv(dev, cont); 1075 return opal_send_recv(dev, cont);
1076} 1076}
1077 1077
1078/*
1079 * request @column from table @table on device @dev. On success, the column
1080 * data will be available in dev->resp->tok[4]
1081 */
1082static int generic_get_column(struct opal_dev *dev, const u8 *table,
1083 u64 column)
1084{
1085 int err;
1086
1087 err = cmd_start(dev, table, opalmethod[OPAL_GET]);
1088
1089 add_token_u8(&err, dev, OPAL_STARTLIST);
1090
1091 add_token_u8(&err, dev, OPAL_STARTNAME);
1092 add_token_u8(&err, dev, OPAL_STARTCOLUMN);
1093 add_token_u64(&err, dev, column);
1094 add_token_u8(&err, dev, OPAL_ENDNAME);
1095
1096 add_token_u8(&err, dev, OPAL_STARTNAME);
1097 add_token_u8(&err, dev, OPAL_ENDCOLUMN);
1098 add_token_u64(&err, dev, column);
1099 add_token_u8(&err, dev, OPAL_ENDNAME);
1100
1101 add_token_u8(&err, dev, OPAL_ENDLIST);
1102
1103 if (err)
1104 return err;
1105
1106 return finalize_and_send(dev, parse_and_check_status);
1107}
1108
1078static int gen_key(struct opal_dev *dev, void *data) 1109static int gen_key(struct opal_dev *dev, void *data)
1079{ 1110{
1080 u8 uid[OPAL_UID_LENGTH]; 1111 u8 uid[OPAL_UID_LENGTH];
@@ -1129,23 +1160,11 @@ static int get_active_key(struct opal_dev *dev, void *data)
1129 if (err) 1160 if (err)
1130 return err; 1161 return err;
1131 1162
1132 err = cmd_start(dev, uid, opalmethod[OPAL_GET]); 1163 err = generic_get_column(dev, uid, OPAL_ACTIVEKEY);
1133 add_token_u8(&err, dev, OPAL_STARTLIST); 1164 if (err)
1134 add_token_u8(&err, dev, OPAL_STARTNAME);
1135 add_token_u8(&err, dev, 3); /* startCloumn */
1136 add_token_u8(&err, dev, 10); /* ActiveKey */
1137 add_token_u8(&err, dev, OPAL_ENDNAME);
1138 add_token_u8(&err, dev, OPAL_STARTNAME);
1139 add_token_u8(&err, dev, 4); /* endColumn */
1140 add_token_u8(&err, dev, 10); /* ActiveKey */
1141 add_token_u8(&err, dev, OPAL_ENDNAME);
1142 add_token_u8(&err, dev, OPAL_ENDLIST);
1143 if (err) {
1144 pr_debug("Error building get active key command\n");
1145 return err; 1165 return err;
1146 }
1147 1166
1148 return finalize_and_send(dev, get_active_key_cont); 1167 return get_active_key_cont(dev);
1149} 1168}
1150 1169
1151static int generic_lr_enable_disable(struct opal_dev *dev, 1170static int generic_lr_enable_disable(struct opal_dev *dev,
@@ -1754,14 +1773,16 @@ static int activate_lsp(struct opal_dev *dev, void *data)
1754 return finalize_and_send(dev, parse_and_check_status); 1773 return finalize_and_send(dev, parse_and_check_status);
1755} 1774}
1756 1775
1757static int get_lsp_lifecycle_cont(struct opal_dev *dev) 1776/* Determine if we're in the Manufactured Inactive or Active state */
1777static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
1758{ 1778{
1759 u8 lc_status; 1779 u8 lc_status;
1760 int error = 0; 1780 int err;
1761 1781
1762 error = parse_and_check_status(dev); 1782 err = generic_get_column(dev, opaluid[OPAL_LOCKINGSP_UID],
1763 if (error) 1783 OPAL_LIFECYCLE);
1764 return error; 1784 if (err)
1785 return err;
1765 1786
1766 lc_status = response_get_u64(&dev->parsed, 4); 1787 lc_status = response_get_u64(&dev->parsed, 4);
1767 /* 0x08 is Manufactured Inactive */ 1788 /* 0x08 is Manufactured Inactive */
@@ -1774,49 +1795,19 @@ static int get_lsp_lifecycle_cont(struct opal_dev *dev)
1774 return 0; 1795 return 0;
1775} 1796}
1776 1797
1777/* Determine if we're in the Manufactured Inactive or Active state */ 1798static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
1778static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
1779{
1780 int err;
1781
1782 err = cmd_start(dev, opaluid[OPAL_LOCKINGSP_UID],
1783 opalmethod[OPAL_GET]);
1784
1785 add_token_u8(&err, dev, OPAL_STARTLIST);
1786
1787 add_token_u8(&err, dev, OPAL_STARTNAME);
1788 add_token_u8(&err, dev, 3); /* Start Column */
1789 add_token_u8(&err, dev, OPAL_LIFECYCLE);
1790 add_token_u8(&err, dev, OPAL_ENDNAME);
1791
1792 add_token_u8(&err, dev, OPAL_STARTNAME);
1793 add_token_u8(&err, dev, 4); /* End Column */
1794 add_token_u8(&err, dev, OPAL_LIFECYCLE);
1795 add_token_u8(&err, dev, OPAL_ENDNAME);
1796
1797 add_token_u8(&err, dev, OPAL_ENDLIST);
1798
1799 if (err) {
1800 pr_debug("Error Building GET Lifecycle Status command\n");
1801 return err;
1802 }
1803
1804 return finalize_and_send(dev, get_lsp_lifecycle_cont);
1805}
1806
1807static int get_msid_cpin_pin_cont(struct opal_dev *dev)
1808{ 1799{
1809 const char *msid_pin; 1800 const char *msid_pin;
1810 size_t strlen; 1801 size_t strlen;
1811 int error = 0; 1802 int err;
1812 1803
1813 error = parse_and_check_status(dev); 1804 err = generic_get_column(dev, opaluid[OPAL_C_PIN_MSID], OPAL_PIN);
1814 if (error) 1805 if (err)
1815 return error; 1806 return err;
1816 1807
1817 strlen = response_get_string(&dev->parsed, 4, &msid_pin); 1808 strlen = response_get_string(&dev->parsed, 4, &msid_pin);
1818 if (!msid_pin) { 1809 if (!msid_pin) {
1819 pr_debug("%s: Couldn't extract PIN from response\n", __func__); 1810 pr_debug("Couldn't extract MSID_CPIN from response\n");
1820 return OPAL_INVAL_PARAM; 1811 return OPAL_INVAL_PARAM;
1821 } 1812 }
1822 1813
@@ -1829,33 +1820,6 @@ static int get_msid_cpin_pin_cont(struct opal_dev *dev)
1829 return 0; 1820 return 0;
1830} 1821}
1831 1822
1832static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
1833{
1834 int err;
1835
1836 err = cmd_start(dev, opaluid[OPAL_C_PIN_MSID],
1837 opalmethod[OPAL_GET]);
1838
1839 add_token_u8(&err, dev, OPAL_STARTLIST);
1840 add_token_u8(&err, dev, OPAL_STARTNAME);
1841 add_token_u8(&err, dev, 3); /* Start Column */
1842 add_token_u8(&err, dev, 3); /* PIN */
1843 add_token_u8(&err, dev, OPAL_ENDNAME);
1844
1845 add_token_u8(&err, dev, OPAL_STARTNAME);
1846 add_token_u8(&err, dev, 4); /* End Column */
1847 add_token_u8(&err, dev, 3); /* Lifecycle Column */
1848 add_token_u8(&err, dev, OPAL_ENDNAME);
1849 add_token_u8(&err, dev, OPAL_ENDLIST);
1850
1851 if (err) {
1852 pr_debug("Error building Get MSID CPIN PIN command.\n");
1853 return err;
1854 }
1855
1856 return finalize_and_send(dev, get_msid_cpin_pin_cont);
1857}
1858
1859static int end_opal_session(struct opal_dev *dev, void *data) 1823static int end_opal_session(struct opal_dev *dev, void *data)
1860{ 1824{
1861 int err = 0; 1825 int err = 0;