diff options
author | David Kozub <zub@linux.fjfi.cvut.cz> | 2019-02-13 19:16:04 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-04-06 13:09:13 -0400 |
commit | 3fff234b851cf7cd638efea658e9cbcf33c3a691 (patch) | |
tree | 2d9848260d175a02d3af7be17713fd13c80de105 /block/sed-opal.c | |
parent | a4ddbd1b7b2cf5d18f34fdf8ddbb539f4c307564 (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.c | 130 |
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 | */ | ||
1082 | static 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 | |||
1078 | static int gen_key(struct opal_dev *dev, void *data) | 1109 | static 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 | ||
1151 | static int generic_lr_enable_disable(struct opal_dev *dev, | 1170 | static 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 | ||
1757 | static int get_lsp_lifecycle_cont(struct opal_dev *dev) | 1776 | /* Determine if we're in the Manufactured Inactive or Active state */ |
1777 | static 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 */ | 1798 | static int get_msid_cpin_pin(struct opal_dev *dev, void *data) |
1778 | static 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 | |||
1807 | static 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 | ||
1832 | static 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 | |||
1859 | static int end_opal_session(struct opal_dev *dev, void *data) | 1823 | static int end_opal_session(struct opal_dev *dev, void *data) |
1860 | { | 1824 | { |
1861 | int err = 0; | 1825 | int err = 0; |