diff options
Diffstat (limited to 'arch/mips/include/asm/octeon')
-rw-r--r-- | arch/mips/include/asm/octeon/cvmx-cmd-queue.h | 4 | ||||
-rw-r--r-- | arch/mips/include/asm/octeon/cvmx-pow.h | 69 | ||||
-rw-r--r-- | arch/mips/include/asm/octeon/cvmx.h | 63 | ||||
-rw-r--r-- | arch/mips/include/asm/octeon/octeon-feature.h | 52 | ||||
-rw-r--r-- | arch/mips/include/asm/octeon/octeon-model.h | 3 |
5 files changed, 31 insertions, 160 deletions
diff --git a/arch/mips/include/asm/octeon/cvmx-cmd-queue.h b/arch/mips/include/asm/octeon/cvmx-cmd-queue.h index 024a71b2bff9..75739c83f07e 100644 --- a/arch/mips/include/asm/octeon/cvmx-cmd-queue.h +++ b/arch/mips/include/asm/octeon/cvmx-cmd-queue.h | |||
@@ -76,6 +76,8 @@ | |||
76 | 76 | ||
77 | #include <linux/prefetch.h> | 77 | #include <linux/prefetch.h> |
78 | 78 | ||
79 | #include <asm/compiler.h> | ||
80 | |||
79 | #include <asm/octeon/cvmx-fpa.h> | 81 | #include <asm/octeon/cvmx-fpa.h> |
80 | /** | 82 | /** |
81 | * By default we disable the max depth support. Most programs | 83 | * By default we disable the max depth support. Most programs |
@@ -273,7 +275,7 @@ static inline void __cvmx_cmd_queue_lock(cvmx_cmd_queue_id_t queue_id, | |||
273 | " lbu %[ticket], %[now_serving]\n" | 275 | " lbu %[ticket], %[now_serving]\n" |
274 | "4:\n" | 276 | "4:\n" |
275 | ".set pop\n" : | 277 | ".set pop\n" : |
276 | [ticket_ptr] "=m"(__cvmx_cmd_queue_state_ptr->ticket[__cvmx_cmd_queue_get_index(queue_id)]), | 278 | [ticket_ptr] "=" GCC_OFF12_ASM()(__cvmx_cmd_queue_state_ptr->ticket[__cvmx_cmd_queue_get_index(queue_id)]), |
277 | [now_serving] "=m"(qptr->now_serving), [ticket] "=r"(tmp), | 279 | [now_serving] "=m"(qptr->now_serving), [ticket] "=r"(tmp), |
278 | [my_ticket] "=r"(my_ticket) | 280 | [my_ticket] "=r"(my_ticket) |
279 | ); | 281 | ); |
diff --git a/arch/mips/include/asm/octeon/cvmx-pow.h b/arch/mips/include/asm/octeon/cvmx-pow.h index 4b4d0ecfd9eb..2188e65afb86 100644 --- a/arch/mips/include/asm/octeon/cvmx-pow.h +++ b/arch/mips/include/asm/octeon/cvmx-pow.h | |||
@@ -1066,7 +1066,7 @@ static inline void __cvmx_pow_warn_if_pending_switch(const char *function) | |||
1066 | uint64_t switch_complete; | 1066 | uint64_t switch_complete; |
1067 | CVMX_MF_CHORD(switch_complete); | 1067 | CVMX_MF_CHORD(switch_complete); |
1068 | if (!switch_complete) | 1068 | if (!switch_complete) |
1069 | pr_warning("%s called with tag switch in progress\n", function); | 1069 | pr_warn("%s called with tag switch in progress\n", function); |
1070 | } | 1070 | } |
1071 | 1071 | ||
1072 | /** | 1072 | /** |
@@ -1084,8 +1084,7 @@ static inline void cvmx_pow_tag_sw_wait(void) | |||
1084 | if (unlikely(switch_complete)) | 1084 | if (unlikely(switch_complete)) |
1085 | break; | 1085 | break; |
1086 | if (unlikely(cvmx_get_cycle() > start_cycle + MAX_CYCLES)) { | 1086 | if (unlikely(cvmx_get_cycle() > start_cycle + MAX_CYCLES)) { |
1087 | pr_warning("Tag switch is taking a long time, " | 1087 | pr_warn("Tag switch is taking a long time, possible deadlock\n"); |
1088 | "possible deadlock\n"); | ||
1089 | start_cycle = -MAX_CYCLES - 1; | 1088 | start_cycle = -MAX_CYCLES - 1; |
1090 | } | 1089 | } |
1091 | } | 1090 | } |
@@ -1296,19 +1295,16 @@ static inline void cvmx_pow_tag_sw_nocheck(uint32_t tag, | |||
1296 | __cvmx_pow_warn_if_pending_switch(__func__); | 1295 | __cvmx_pow_warn_if_pending_switch(__func__); |
1297 | current_tag = cvmx_pow_get_current_tag(); | 1296 | current_tag = cvmx_pow_get_current_tag(); |
1298 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) | 1297 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) |
1299 | pr_warning("%s called with NULL_NULL tag\n", | 1298 | pr_warn("%s called with NULL_NULL tag\n", __func__); |
1300 | __func__); | ||
1301 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL) | 1299 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL) |
1302 | pr_warning("%s called with NULL tag\n", __func__); | 1300 | pr_warn("%s called with NULL tag\n", __func__); |
1303 | if ((current_tag.s.type == tag_type) | 1301 | if ((current_tag.s.type == tag_type) |
1304 | && (current_tag.s.tag == tag)) | 1302 | && (current_tag.s.tag == tag)) |
1305 | pr_warning("%s called to perform a tag switch to the " | 1303 | pr_warn("%s called to perform a tag switch to the same tag\n", |
1306 | "same tag\n", | 1304 | __func__); |
1307 | __func__); | ||
1308 | if (tag_type == CVMX_POW_TAG_TYPE_NULL) | 1305 | if (tag_type == CVMX_POW_TAG_TYPE_NULL) |
1309 | pr_warning("%s called to perform a tag switch to " | 1306 | pr_warn("%s called to perform a tag switch to NULL. Use cvmx_pow_tag_sw_null() instead\n", |
1310 | "NULL. Use cvmx_pow_tag_sw_null() instead\n", | 1307 | __func__); |
1311 | __func__); | ||
1312 | } | 1308 | } |
1313 | 1309 | ||
1314 | /* | 1310 | /* |
@@ -1407,23 +1403,19 @@ static inline void cvmx_pow_tag_sw_full_nocheck(cvmx_wqe_t *wqp, uint32_t tag, | |||
1407 | __cvmx_pow_warn_if_pending_switch(__func__); | 1403 | __cvmx_pow_warn_if_pending_switch(__func__); |
1408 | current_tag = cvmx_pow_get_current_tag(); | 1404 | current_tag = cvmx_pow_get_current_tag(); |
1409 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) | 1405 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) |
1410 | pr_warning("%s called with NULL_NULL tag\n", | 1406 | pr_warn("%s called with NULL_NULL tag\n", __func__); |
1411 | __func__); | ||
1412 | if ((current_tag.s.type == tag_type) | 1407 | if ((current_tag.s.type == tag_type) |
1413 | && (current_tag.s.tag == tag)) | 1408 | && (current_tag.s.tag == tag)) |
1414 | pr_warning("%s called to perform a tag switch to " | 1409 | pr_warn("%s called to perform a tag switch to the same tag\n", |
1415 | "the same tag\n", | 1410 | __func__); |
1416 | __func__); | ||
1417 | if (tag_type == CVMX_POW_TAG_TYPE_NULL) | 1411 | if (tag_type == CVMX_POW_TAG_TYPE_NULL) |
1418 | pr_warning("%s called to perform a tag switch to " | 1412 | pr_warn("%s called to perform a tag switch to NULL. Use cvmx_pow_tag_sw_null() instead\n", |
1419 | "NULL. Use cvmx_pow_tag_sw_null() instead\n", | 1413 | __func__); |
1420 | __func__); | ||
1421 | if (wqp != cvmx_phys_to_ptr(0x80)) | 1414 | if (wqp != cvmx_phys_to_ptr(0x80)) |
1422 | if (wqp != cvmx_pow_get_current_wqp()) | 1415 | if (wqp != cvmx_pow_get_current_wqp()) |
1423 | pr_warning("%s passed WQE(%p) doesn't match " | 1416 | pr_warn("%s passed WQE(%p) doesn't match the address in the POW(%p)\n", |
1424 | "the address in the POW(%p)\n", | 1417 | __func__, wqp, |
1425 | __func__, wqp, | 1418 | cvmx_pow_get_current_wqp()); |
1426 | cvmx_pow_get_current_wqp()); | ||
1427 | } | 1419 | } |
1428 | 1420 | ||
1429 | /* | 1421 | /* |
@@ -1507,12 +1499,10 @@ static inline void cvmx_pow_tag_sw_null_nocheck(void) | |||
1507 | __cvmx_pow_warn_if_pending_switch(__func__); | 1499 | __cvmx_pow_warn_if_pending_switch(__func__); |
1508 | current_tag = cvmx_pow_get_current_tag(); | 1500 | current_tag = cvmx_pow_get_current_tag(); |
1509 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) | 1501 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) |
1510 | pr_warning("%s called with NULL_NULL tag\n", | 1502 | pr_warn("%s called with NULL_NULL tag\n", __func__); |
1511 | __func__); | ||
1512 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL) | 1503 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL) |
1513 | pr_warning("%s called when we already have a " | 1504 | pr_warn("%s called when we already have a NULL tag\n", |
1514 | "NULL tag\n", | 1505 | __func__); |
1515 | __func__); | ||
1516 | } | 1506 | } |
1517 | 1507 | ||
1518 | tag_req.u64 = 0; | 1508 | tag_req.u64 = 0; |
@@ -1725,17 +1715,14 @@ static inline void cvmx_pow_tag_sw_desched_nocheck( | |||
1725 | __cvmx_pow_warn_if_pending_switch(__func__); | 1715 | __cvmx_pow_warn_if_pending_switch(__func__); |
1726 | current_tag = cvmx_pow_get_current_tag(); | 1716 | current_tag = cvmx_pow_get_current_tag(); |
1727 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) | 1717 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) |
1728 | pr_warning("%s called with NULL_NULL tag\n", | 1718 | pr_warn("%s called with NULL_NULL tag\n", __func__); |
1729 | __func__); | ||
1730 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL) | 1719 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL) |
1731 | pr_warning("%s called with NULL tag. Deschedule not " | 1720 | pr_warn("%s called with NULL tag. Deschedule not allowed from NULL state\n", |
1732 | "allowed from NULL state\n", | 1721 | __func__); |
1733 | __func__); | ||
1734 | if ((current_tag.s.type != CVMX_POW_TAG_TYPE_ATOMIC) | 1722 | if ((current_tag.s.type != CVMX_POW_TAG_TYPE_ATOMIC) |
1735 | && (tag_type != CVMX_POW_TAG_TYPE_ATOMIC)) | 1723 | && (tag_type != CVMX_POW_TAG_TYPE_ATOMIC)) |
1736 | pr_warning("%s called where neither the before or " | 1724 | pr_warn("%s called where neither the before or after tag is ATOMIC\n", |
1737 | "after tag is ATOMIC\n", | 1725 | __func__); |
1738 | __func__); | ||
1739 | } | 1726 | } |
1740 | 1727 | ||
1741 | tag_req.u64 = 0; | 1728 | tag_req.u64 = 0; |
@@ -1832,12 +1819,10 @@ static inline void cvmx_pow_desched(uint64_t no_sched) | |||
1832 | __cvmx_pow_warn_if_pending_switch(__func__); | 1819 | __cvmx_pow_warn_if_pending_switch(__func__); |
1833 | current_tag = cvmx_pow_get_current_tag(); | 1820 | current_tag = cvmx_pow_get_current_tag(); |
1834 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) | 1821 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL) |
1835 | pr_warning("%s called with NULL_NULL tag\n", | 1822 | pr_warn("%s called with NULL_NULL tag\n", __func__); |
1836 | __func__); | ||
1837 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL) | 1823 | if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL) |
1838 | pr_warning("%s called with NULL tag. Deschedule not " | 1824 | pr_warn("%s called with NULL tag. Deschedule not expected from NULL state\n", |
1839 | "expected from NULL state\n", | 1825 | __func__); |
1840 | __func__); | ||
1841 | } | 1826 | } |
1842 | 1827 | ||
1843 | /* Need to make sure any writes to the work queue entry are complete */ | 1828 | /* Need to make sure any writes to the work queue entry are complete */ |
diff --git a/arch/mips/include/asm/octeon/cvmx.h b/arch/mips/include/asm/octeon/cvmx.h index f991e7701d3d..33db1c806b01 100644 --- a/arch/mips/include/asm/octeon/cvmx.h +++ b/arch/mips/include/asm/octeon/cvmx.h | |||
@@ -451,67 +451,4 @@ static inline uint32_t cvmx_octeon_num_cores(void) | |||
451 | return cvmx_pop(ciu_fuse); | 451 | return cvmx_pop(ciu_fuse); |
452 | } | 452 | } |
453 | 453 | ||
454 | /** | ||
455 | * Read a byte of fuse data | ||
456 | * @byte_addr: address to read | ||
457 | * | ||
458 | * Returns fuse value: 0 or 1 | ||
459 | */ | ||
460 | static uint8_t cvmx_fuse_read_byte(int byte_addr) | ||
461 | { | ||
462 | union cvmx_mio_fus_rcmd read_cmd; | ||
463 | |||
464 | read_cmd.u64 = 0; | ||
465 | read_cmd.s.addr = byte_addr; | ||
466 | read_cmd.s.pend = 1; | ||
467 | cvmx_write_csr(CVMX_MIO_FUS_RCMD, read_cmd.u64); | ||
468 | while ((read_cmd.u64 = cvmx_read_csr(CVMX_MIO_FUS_RCMD)) | ||
469 | && read_cmd.s.pend) | ||
470 | ; | ||
471 | return read_cmd.s.dat; | ||
472 | } | ||
473 | |||
474 | /** | ||
475 | * Read a single fuse bit | ||
476 | * | ||
477 | * @fuse: Fuse number (0-1024) | ||
478 | * | ||
479 | * Returns fuse value: 0 or 1 | ||
480 | */ | ||
481 | static inline int cvmx_fuse_read(int fuse) | ||
482 | { | ||
483 | return (cvmx_fuse_read_byte(fuse >> 3) >> (fuse & 0x7)) & 1; | ||
484 | } | ||
485 | |||
486 | static inline int cvmx_octeon_model_CN36XX(void) | ||
487 | { | ||
488 | return OCTEON_IS_MODEL(OCTEON_CN38XX) | ||
489 | && !cvmx_octeon_is_pass1() | ||
490 | && cvmx_fuse_read(264); | ||
491 | } | ||
492 | |||
493 | static inline int cvmx_octeon_zip_present(void) | ||
494 | { | ||
495 | return octeon_has_feature(OCTEON_FEATURE_ZIP); | ||
496 | } | ||
497 | |||
498 | static inline int cvmx_octeon_dfa_present(void) | ||
499 | { | ||
500 | if (!OCTEON_IS_MODEL(OCTEON_CN38XX) | ||
501 | && !OCTEON_IS_MODEL(OCTEON_CN31XX) | ||
502 | && !OCTEON_IS_MODEL(OCTEON_CN58XX)) | ||
503 | return 0; | ||
504 | else if (OCTEON_IS_MODEL(OCTEON_CN3020)) | ||
505 | return 0; | ||
506 | else if (cvmx_octeon_is_pass1()) | ||
507 | return 1; | ||
508 | else | ||
509 | return !cvmx_fuse_read(120); | ||
510 | } | ||
511 | |||
512 | static inline int cvmx_octeon_crypto_present(void) | ||
513 | { | ||
514 | return octeon_has_feature(OCTEON_FEATURE_CRYPTO); | ||
515 | } | ||
516 | |||
517 | #endif /* __CVMX_H__ */ | 454 | #endif /* __CVMX_H__ */ |
diff --git a/arch/mips/include/asm/octeon/octeon-feature.h b/arch/mips/include/asm/octeon/octeon-feature.h index 90e05a8d4b15..c4fe81f47f53 100644 --- a/arch/mips/include/asm/octeon/octeon-feature.h +++ b/arch/mips/include/asm/octeon/octeon-feature.h | |||
@@ -86,8 +86,6 @@ enum octeon_feature { | |||
86 | OCTEON_MAX_FEATURE | 86 | OCTEON_MAX_FEATURE |
87 | }; | 87 | }; |
88 | 88 | ||
89 | static inline int cvmx_fuse_read(int fuse); | ||
90 | |||
91 | /** | 89 | /** |
92 | * Determine if the current Octeon supports a specific feature. These | 90 | * Determine if the current Octeon supports a specific feature. These |
93 | * checks have been optimized to be fairly quick, but they should still | 91 | * checks have been optimized to be fairly quick, but they should still |
@@ -105,33 +103,6 @@ static inline int octeon_has_feature(enum octeon_feature feature) | |||
105 | case OCTEON_FEATURE_SAAD: | 103 | case OCTEON_FEATURE_SAAD: |
106 | return !OCTEON_IS_MODEL(OCTEON_CN3XXX); | 104 | return !OCTEON_IS_MODEL(OCTEON_CN3XXX); |
107 | 105 | ||
108 | case OCTEON_FEATURE_ZIP: | ||
109 | if (OCTEON_IS_MODEL(OCTEON_CN30XX) | ||
110 | || OCTEON_IS_MODEL(OCTEON_CN50XX) | ||
111 | || OCTEON_IS_MODEL(OCTEON_CN52XX)) | ||
112 | return 0; | ||
113 | else if (OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1)) | ||
114 | return 1; | ||
115 | else | ||
116 | return !cvmx_fuse_read(121); | ||
117 | |||
118 | case OCTEON_FEATURE_CRYPTO: | ||
119 | if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) { | ||
120 | union cvmx_mio_fus_dat2 fus_2; | ||
121 | fus_2.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT2); | ||
122 | if (fus_2.s.nocrypto || fus_2.s.nomul) { | ||
123 | return 0; | ||
124 | } else if (!fus_2.s.dorm_crypto) { | ||
125 | return 1; | ||
126 | } else { | ||
127 | union cvmx_rnm_ctl_status st; | ||
128 | st.u64 = cvmx_read_csr(CVMX_RNM_CTL_STATUS); | ||
129 | return st.s.eer_val; | ||
130 | } | ||
131 | } else { | ||
132 | return !cvmx_fuse_read(90); | ||
133 | } | ||
134 | |||
135 | case OCTEON_FEATURE_DORM_CRYPTO: | 106 | case OCTEON_FEATURE_DORM_CRYPTO: |
136 | if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) { | 107 | if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) { |
137 | union cvmx_mio_fus_dat2 fus_2; | 108 | union cvmx_mio_fus_dat2 fus_2; |
@@ -188,29 +159,6 @@ static inline int octeon_has_feature(enum octeon_feature feature) | |||
188 | && !OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X) | 159 | && !OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X) |
189 | && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X); | 160 | && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X); |
190 | 161 | ||
191 | case OCTEON_FEATURE_DFA: | ||
192 | if (!OCTEON_IS_MODEL(OCTEON_CN38XX) | ||
193 | && !OCTEON_IS_MODEL(OCTEON_CN31XX) | ||
194 | && !OCTEON_IS_MODEL(OCTEON_CN58XX)) | ||
195 | return 0; | ||
196 | else if (OCTEON_IS_MODEL(OCTEON_CN3020)) | ||
197 | return 0; | ||
198 | else | ||
199 | return !cvmx_fuse_read(120); | ||
200 | |||
201 | case OCTEON_FEATURE_HFA: | ||
202 | if (!OCTEON_IS_MODEL(OCTEON_CN6XXX)) | ||
203 | return 0; | ||
204 | else | ||
205 | return !cvmx_fuse_read(90); | ||
206 | |||
207 | case OCTEON_FEATURE_DFM: | ||
208 | if (!(OCTEON_IS_MODEL(OCTEON_CN63XX) | ||
209 | || OCTEON_IS_MODEL(OCTEON_CN66XX))) | ||
210 | return 0; | ||
211 | else | ||
212 | return !cvmx_fuse_read(90); | ||
213 | |||
214 | case OCTEON_FEATURE_MDIO_CLAUSE_45: | 162 | case OCTEON_FEATURE_MDIO_CLAUSE_45: |
215 | return !(OCTEON_IS_MODEL(OCTEON_CN3XXX) | 163 | return !(OCTEON_IS_MODEL(OCTEON_CN3XXX) |
216 | || OCTEON_IS_MODEL(OCTEON_CN58XX) | 164 | || OCTEON_IS_MODEL(OCTEON_CN58XX) |
diff --git a/arch/mips/include/asm/octeon/octeon-model.h b/arch/mips/include/asm/octeon/octeon-model.h index e2c122c6a657..e8a1c2fd52cd 100644 --- a/arch/mips/include/asm/octeon/octeon-model.h +++ b/arch/mips/include/asm/octeon/octeon-model.h | |||
@@ -326,8 +326,7 @@ static inline int __octeon_is_model_runtime__(uint32_t model) | |||
326 | #define OCTEON_IS_COMMON_BINARY() 1 | 326 | #define OCTEON_IS_COMMON_BINARY() 1 |
327 | #undef OCTEON_MODEL | 327 | #undef OCTEON_MODEL |
328 | 328 | ||
329 | const char *octeon_model_get_string(uint32_t chip_id); | 329 | const char *__init octeon_model_get_string(uint32_t chip_id); |
330 | const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer); | ||
331 | 330 | ||
332 | /* | 331 | /* |
333 | * Return the octeon family, i.e., ProcessorID of the PrID register. | 332 | * Return the octeon family, i.e., ProcessorID of the PrID register. |