* Extend SPI NAND continuous read to Winbond devices, which requires numerous changes in the spi-{mem,nand} layers such as the need for a secondary read operation template. * Continuous reads in general have also been enhanced/fixed for avoiding potential issues at probe time and at block boundaries. Plus, there is the usual load of misc fixes and improvements.
Showing the changes to include (24 of 577 files). Show all
Unified · Split
| @@ -17,6 +17,8 @@ · 16 unmodified lines | |||
| 17 | #include <linux/property.h> | 17 | #include <linux/property.h> |
| 18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| 19 | 19 | ||
| 20 | struct notifier_block; | ||
| 21 | |||
| 20 | struct acpi_handle_list { | 22 | struct acpi_handle_list { |
| 21 | u32 count; | 23 | u32 count; |
| 22 | acpi_handle *handles; | 24 | acpi_handle *handles; |
| @@ -1386,6 +1386,12 @@ enum acpi_einj_command_status { · 1385 unmodified lines | |||
| 1386 | #define ACPI_EINJ_CXL_MEM_FATAL (1<<17) | 1386 | #define ACPI_EINJ_CXL_MEM_FATAL (1<<17) |
| 1387 | #define ACPI_EINJ_VENDOR_DEFINED (1<<31) | 1387 | #define ACPI_EINJ_VENDOR_DEFINED (1<<31) |
| 1388 | 1388 | ||
| 1389 | /* EINJV2 error types from EINJV2_GET_ERROR_TYPE (ACPI 6.6) */ | ||
| 1390 | |||
| 1391 | #define ACPI_EINJV2_PROCESSOR (1) | ||
| 1392 | #define ACPI_EINJV2_MEMORY (1<<1) | ||
| 1393 | #define ACPI_EINJV2_PCIE (1<<2) | ||
| 1394 | |||
| 1389 | /******************************************************************************* | 1395 | /******************************************************************************* |
| 1390 | * | 1396 | * |
| 1391 | * ERST - Error Record Serialization Table (ACPI 4.0) | 1397 | * ERST - Error Record Serialization Table (ACPI 4.0) |
| @@ -273,6 +273,12 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); · 272 unmodified lines | |||
| 273 | int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper); | 273 | int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper); |
| 274 | bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper, | 274 | bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper, |
| 275 | const struct drm_gem_object *obj); | 275 | const struct drm_gem_object *obj); |
| 276 | #else | ||
| 277 | static inline bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper, | ||
| 278 | const struct drm_gem_object *obj) | ||
| 279 | { | ||
| 280 | return false; | ||
| 281 | } | ||
| 276 | #endif | 282 | #endif |
| 277 | 283 | ||
| 278 | #endif | 284 | #endif |
| @@ -108,6 +108,7 @@ int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev, · 107 unmodified lines | |||
| 108 | extern unsigned int cdrom_check_events(struct cdrom_device_info *cdi, | 108 | extern unsigned int cdrom_check_events(struct cdrom_device_info *cdi, |
| 109 | unsigned int clearing); | 109 | unsigned int clearing); |
| 110 | 110 | ||
| 111 | extern void cdrom_probe_write_features(struct cdrom_device_info *cdi); | ||
| 111 | extern int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi); | 112 | extern int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi); |
| 112 | extern void unregister_cdrom(struct cdrom_device_info *cdi); | 113 | extern void unregister_cdrom(struct cdrom_device_info *cdi); |
| 113 | 114 | ||
| @@ -322,13 +322,13 @@ struct dma_buf { · 321 unmodified lines | |||
| 322 | * @vmapping_counter: | 322 | * @vmapping_counter: |
| 323 | * | 323 | * |
| 324 | * Used internally to refcnt the vmaps returned by dma_buf_vmap(). | 324 | * Used internally to refcnt the vmaps returned by dma_buf_vmap(). |
| 325 | * Protected by @lock. | 325 | * Protected by @resv. |
| 326 | */ | 326 | */ |
| 327 | unsigned vmapping_counter; | 327 | unsigned vmapping_counter; |
| 328 | 328 | ||
| 329 | /** | 329 | /** |
| 330 | * @vmap_ptr: | 330 | * @vmap_ptr: |
| 331 | * The current vmap ptr if @vmapping_counter > 0. Protected by @lock. | 331 | * The current vmap ptr if @vmapping_counter > 0. Protected by @resv. |
| 332 | */ | 332 | */ |
| 333 | struct iosys_map vmap_ptr; | 333 | struct iosys_map vmap_ptr; |
| 334 | 334 | ||
| @@ -286,6 +286,7 @@ int dpll_pin_ref_sync_pair_add(struct dpll_pin *pin, · 285 unmodified lines | |||
| 286 | 286 | ||
| 287 | int dpll_device_change_ntf(struct dpll_device *dpll); | 287 | int dpll_device_change_ntf(struct dpll_device *dpll); |
| 288 | 288 | ||
| 289 | int __dpll_pin_change_ntf(struct dpll_pin *pin); | ||
| 289 | int dpll_pin_change_ntf(struct dpll_pin *pin); | 290 | int dpll_pin_change_ntf(struct dpll_pin *pin); |
| 290 | 291 | ||
| 291 | int register_dpll_notifier(struct notifier_block *nb); | 292 | int register_dpll_notifier(struct notifier_block *nb); |
| @@ -915,6 +915,7 @@ extern void fsnotify_clear_marks_by_group(struct fsnotify_group *group, · 914 unmodified lines | |||
| 915 | unsigned int obj_type); | 915 | unsigned int obj_type); |
| 916 | extern void fsnotify_get_mark(struct fsnotify_mark *mark); | 916 | extern void fsnotify_get_mark(struct fsnotify_mark *mark); |
| 917 | extern void fsnotify_put_mark(struct fsnotify_mark *mark); | 917 | extern void fsnotify_put_mark(struct fsnotify_mark *mark); |
| 918 | struct fsnotify_mark *fsnotify_next_mark(struct fsnotify_mark *mark); | ||
| 918 | extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info); | 919 | extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info); |
| 919 | extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info); | 920 | extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info); |
| 920 | 921 | ||
| @@ -45,6 +45,7 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg); · 44 unmodified lines | |||
| 45 | int mbox_flush(struct mbox_chan *chan, unsigned long timeout); | 45 | int mbox_flush(struct mbox_chan *chan, unsigned long timeout); |
| 46 | void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */ | 46 | void mbox_client_txdone(struct mbox_chan *chan, int r); /* atomic */ |
| 47 | bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */ | 47 | bool mbox_client_peek_data(struct mbox_chan *chan); /* atomic */ |
| 48 | unsigned int mbox_chan_tx_slots_available(struct mbox_chan *chan); /* atomic */ | ||
| 48 | void mbox_free_channel(struct mbox_chan *chan); /* may sleep */ | 49 | void mbox_free_channel(struct mbox_chan *chan); /* may sleep */ |
| 49 | 50 | ||
| 50 | #endif /* __MAILBOX_CLIENT_H */ | 51 | #endif /* __MAILBOX_CLIENT_H */ |
| @@ -3,6 +3,7 @@ · 2 unmodified lines | |||
| 3 | #ifndef __MAILBOX_CONTROLLER_H | 3 | #ifndef __MAILBOX_CONTROLLER_H |
| 4 | #define __MAILBOX_CONTROLLER_H | 4 | #define __MAILBOX_CONTROLLER_H |
| 5 | 5 | ||
| 6 | #include <linux/bits.h> | ||
| 6 | #include <linux/completion.h> | 7 | #include <linux/completion.h> |
| 7 | #include <linux/device.h> | 8 | #include <linux/device.h> |
| 8 | #include <linux/hrtimer.h> | 9 | #include <linux/hrtimer.h> |
| @@ -11,6 +12,13 @@ · 2 unmodified lines | |||
| 11 | 12 | ||
| 12 | struct mbox_chan; | 13 | struct mbox_chan; |
| 13 | 14 | ||
| 15 | /* Sentinel value distinguishing "no active request" from "NULL message data" */ | ||
| 16 | #define MBOX_NO_MSG ((void *)-1) | ||
| 17 | |||
| 18 | #define MBOX_TXDONE_BY_IRQ BIT(0) /* controller has remote RTR irq */ | ||
| 19 | #define MBOX_TXDONE_BY_POLL BIT(1) /* controller can read status of last TX */ | ||
| 20 | #define MBOX_TXDONE_BY_ACK BIT(2) /* S/W ACK received by Client ticks the TX */ | ||
| 21 | |||
| 14 | /** | 22 | /** |
| 15 | * struct mbox_chan_ops - methods to control mailbox channels | 23 | * struct mbox_chan_ops - methods to control mailbox channels |
| 16 | * @send_data: The API asks the MBOX controller driver, in atomic | 24 | * @send_data: The API asks the MBOX controller driver, in atomic |
| @@ -54,10 +62,10 @@ struct mbox_chan_ops { · 37 unmodified lines | |||
| 54 | 62 | ||
| 55 | /** | 63 | /** |
| 56 | * struct mbox_controller - Controller of a class of communication channels | 64 | * struct mbox_controller - Controller of a class of communication channels |
| 57 | * @dev: Device backing this controller | 65 | * @dev: Device backing this controller. Required. |
| 58 | * @ops: Operators that work on each communication chan | 66 | * @ops: Operators that work on each communication chan. Required. |
| 59 | * @chans: Array of channels | 67 | * @chans: Array of channels. Required. |
| 60 | * @num_chans: Number of channels in the 'chans' array. | 68 | * @num_chans: Number of channels in the 'chans' array. Required. |
| 61 | * @txdone_irq: Indicates if the controller can report to API when | 69 | * @txdone_irq: Indicates if the controller can report to API when |
| 62 | * the last transmitted data was read by the remote. | 70 | * the last transmitted data was read by the remote. |
| 63 | * Eg, if it has some TX ACK irq. | 71 | * Eg, if it has some TX ACK irq. |
| @@ -70,6 +78,7 @@ struct mbox_chan_ops { · 6 unmodified lines | |||
| 70 | * @of_xlate: Controller driver specific mapping of channel via DT | 78 | * @of_xlate: Controller driver specific mapping of channel via DT |
| 71 | * @poll_hrt: API private. hrtimer used to poll for TXDONE on all | 79 | * @poll_hrt: API private. hrtimer used to poll for TXDONE on all |
| 72 | * channels. | 80 | * channels. |
| 81 | * @poll_hrt_lock: API private. Lock protecting access to poll_hrt. | ||
| 73 | * @node: API private. To hook into list of controllers. | 82 | * @node: API private. To hook into list of controllers. |
| 74 | */ | 83 | */ |
| 75 | struct mbox_controller { | 84 | struct mbox_controller { |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | |||
| 4 | /* | 4 | /* |
| 5 | * Maple Tree - An RCU-safe adaptive tree for storing ranges | 5 | * Maple Tree - An RCU-safe adaptive tree for storing ranges |
| 6 | * Copyright (c) 2018-2022 Oracle | 6 | * Copyright (c) 2018-2022 Oracle |
| 7 | * Authors: Liam R. Howlett <Liam.Howlett@Oracle.com> | 7 | * Authors: Liam R. Howlett <liam@infradead.org> |
| 8 | * Matthew Wilcox <willy@infradead.org> | 8 | * Matthew Wilcox <willy@infradead.org> |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| @@ -4391,7 +4391,7 @@ static inline void mmap_action_map_kernel_pages_full(struct vm_area_desc *desc, · 4390 unmodified lines | |||
| 4391 | 4391 | ||
| 4392 | int mmap_action_prepare(struct vm_area_desc *desc); | 4392 | int mmap_action_prepare(struct vm_area_desc *desc); |
| 4393 | int mmap_action_complete(struct vm_area_struct *vma, | 4393 | int mmap_action_complete(struct vm_area_struct *vma, |
| 4394 | struct mmap_action *action); | 4394 | struct mmap_action *action, bool is_compat); |
| 4395 | 4395 | ||
| 4396 | /* Look up the first VMA which exactly match the interval vm_start ... vm_end */ | 4396 | /* Look up the first VMA which exactly match the interval vm_start ... vm_end */ |
| 4397 | static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm, | 4397 | static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm, |
| @@ -226,6 +226,7 @@ struct mr_table_ops { · 225 unmodified lines | |||
| 226 | 226 | ||
| 227 | /** | 227 | /** |
| 228 | * struct mr_table - a multicast routing table | 228 | * struct mr_table - a multicast routing table |
| 229 | * @work: used for table destruction | ||
| 229 | * @list: entry within a list of multicast routing tables | 230 | * @list: entry within a list of multicast routing tables |
| 230 | * @net: net where this table belongs | 231 | * @net: net where this table belongs |
| 231 | * @ops: protocol specific operations | 232 | * @ops: protocol specific operations |
| @@ -243,6 +244,7 @@ struct mr_table_ops { · 11 unmodified lines | |||
| 243 | * @mroute_reg_vif_num: PIM-device vif index | 244 | * @mroute_reg_vif_num: PIM-device vif index |
| 244 | */ | 245 | */ |
| 245 | struct mr_table { | 246 | struct mr_table { |
| 247 | struct rcu_work work; | ||
| 246 | struct list_head list; | 248 | struct list_head list; |
| 247 | possible_net_t net; | 249 | possible_net_t net; |
| 248 | struct mr_table_ops ops; | 250 | struct mr_table_ops ops; |
| @@ -274,6 +276,7 @@ void vif_device_init(struct vif_device *v, · 25 unmodified lines | |||
| 274 | unsigned short flags, | 276 | unsigned short flags, |
| 275 | unsigned short get_iflink_mask); | 277 | unsigned short get_iflink_mask); |
| 276 | 278 | ||
| 279 | void mr_table_free(struct mr_table *mrt); | ||
| 277 | struct mr_table * | 280 | struct mr_table * |
| 278 | mr_table_alloc(struct net *net, u32 id, | 281 | mr_table_alloc(struct net *net, u32 id, |
| 279 | struct mr_table_ops *ops, | 282 | struct mr_table_ops *ops, |
| @@ -9,6 +9,8 @@ · 8 unmodified lines | |||
| 9 | #ifndef __MTD_NAND_QPIC_COMMON_H__ | 9 | #ifndef __MTD_NAND_QPIC_COMMON_H__ |
| 10 | #define __MTD_NAND_QPIC_COMMON_H__ | 10 | #define __MTD_NAND_QPIC_COMMON_H__ |
| 11 | 11 | ||
| 12 | #include <linux/mtd/rawnand.h> | ||
| 13 | |||
| 12 | /* NANDc reg offsets */ | 14 | /* NANDc reg offsets */ |
| 13 | #define NAND_FLASH_CMD 0x00 | 15 | #define NAND_FLASH_CMD 0x00 |
| 14 | #define NAND_ADDR0 0x04 | 16 | #define NAND_ADDR0 0x04 |
| @@ -394,7 +396,7 @@ struct qcom_nand_controller { · 379 unmodified lines | |||
| 394 | 396 | ||
| 395 | const struct qcom_nandc_props *props; | 397 | const struct qcom_nandc_props *props; |
| 396 | 398 | ||
| 397 | struct nand_controller *controller; | 399 | struct nand_controller controller; |
| 398 | struct qpic_spi_nand *qspi; | 400 | struct qpic_spi_nand *qspi; |
| 399 | struct list_head host_list; | 401 | struct list_head host_list; |
| 400 | 402 | ||
| @@ -290,6 +290,12 @@ · 289 unmodified lines | |||
| 290 | SPI_MEM_OP_NO_DUMMY, \ | 290 | SPI_MEM_OP_NO_DUMMY, \ |
| 291 | SPI_MEM_OP_NO_DATA) | 291 | SPI_MEM_OP_NO_DATA) |
| 292 | 292 | ||
| 293 | #define SPINAND_PAGE_READ_PACKED_8D_8D_0_OP(addr) \ | ||
| 294 | SPI_MEM_OP(SPI_MEM_DTR_OP_PACKED_CMD(0x13, addr >> 16, 8), \ | ||
| 295 | SPI_MEM_DTR_OP_ADDR(2, addr & 0xffff, 8), \ | ||
| 296 | SPI_MEM_OP_NO_DUMMY, \ | ||
| 297 | SPI_MEM_OP_NO_DATA) | ||
| 298 | |||
| 293 | #define SPINAND_PAGE_READ_FROM_CACHE_8D_8D_8D_OP(addr, ndummy, buf, len, freq) \ | 299 | #define SPINAND_PAGE_READ_FROM_CACHE_8D_8D_8D_OP(addr, ndummy, buf, len, freq) \ |
| 294 | SPI_MEM_OP(SPI_MEM_DTR_OP_RPT_CMD(0x9d, 8), \ | 300 | SPI_MEM_OP(SPI_MEM_DTR_OP_RPT_CMD(0x9d, 8), \ |
| 295 | SPI_MEM_DTR_OP_ADDR(2, addr, 8), \ | 301 | SPI_MEM_DTR_OP_ADDR(2, addr, 8), \ |
| @@ -483,6 +489,7 @@ struct spinand_ecc_info { · 187 unmodified lines | |||
| 483 | #define SPINAND_HAS_PROG_PLANE_SELECT_BIT BIT(2) | 489 | #define SPINAND_HAS_PROG_PLANE_SELECT_BIT BIT(2) |
| 484 | #define SPINAND_HAS_READ_PLANE_SELECT_BIT BIT(3) | 490 | #define SPINAND_HAS_READ_PLANE_SELECT_BIT BIT(3) |
| 485 | #define SPINAND_NO_RAW_ACCESS BIT(4) | 491 | #define SPINAND_NO_RAW_ACCESS BIT(4) |
| 492 | #define SPINAND_ODTR_PACKED_PAGE_READ BIT(5) | ||
| 486 | 493 | ||
| 487 | /** | 494 | /** |
| 488 | * struct spinand_ondie_ecc_conf - private SPI-NAND on-die ECC engine structure | 495 | * struct spinand_ondie_ecc_conf - private SPI-NAND on-die ECC engine structure |
| @@ -576,6 +583,7 @@ enum spinand_bus_interface { · 87 unmodified lines | |||
| 576 | * @op_variants.read_cache: variants of the read-cache operation | 583 | * @op_variants.read_cache: variants of the read-cache operation |
| 577 | * @op_variants.write_cache: variants of the write-cache operation | 584 | * @op_variants.write_cache: variants of the write-cache operation |
| 578 | * @op_variants.update_cache: variants of the update-cache operation | 585 | * @op_variants.update_cache: variants of the update-cache operation |
| 586 | * @op_variants.cont_read_cache: variants of the continuous read-cache operation | ||
| 579 | * @vendor_ops: vendor specific operations | 587 | * @vendor_ops: vendor specific operations |
| 580 | * @select_target: function used to select a target/die. Required only for | 588 | * @select_target: function used to select a target/die. Required only for |
| 581 | * multi-die chips | 589 | * multi-die chips |
| @@ -585,6 +593,7 @@ enum spinand_bus_interface { · 3 unmodified lines | |||
| 585 | * @user_otp: SPI NAND user OTP info. | 593 | * @user_otp: SPI NAND user OTP info. |
| 586 | * @read_retries: the number of read retry modes supported | 594 | * @read_retries: the number of read retry modes supported |
| 587 | * @set_read_retry: enable/disable read retry for data recovery | 595 | * @set_read_retry: enable/disable read retry for data recovery |
| 596 | * @set_randomizer: enable/disable randomizer support | ||
| 588 | * | 597 | * |
| 589 | * Each SPI NAND manufacturer driver should have a spinand_info table | 598 | * Each SPI NAND manufacturer driver should have a spinand_info table |
| 590 | * describing all the chips supported by the driver. | 599 | * describing all the chips supported by the driver. |
| @@ -600,6 +609,7 @@ struct spinand_info { · 9 unmodified lines | |||
| 600 | const struct spinand_op_variants *read_cache; | 609 | const struct spinand_op_variants *read_cache; |
| 601 | const struct spinand_op_variants *write_cache; | 610 | const struct spinand_op_variants *write_cache; |
| 602 | const struct spinand_op_variants *update_cache; | 611 | const struct spinand_op_variants *update_cache; |
| 612 | const struct spinand_op_variants *cont_read_cache; | ||
| 603 | } op_variants; | 613 | } op_variants; |
| 604 | const struct spinand_op_variants *vendor_ops; | 614 | const struct spinand_op_variants *vendor_ops; |
| 605 | int (*select_target)(struct spinand_device *spinand, | 615 | int (*select_target)(struct spinand_device *spinand, |
| @@ -613,6 +623,8 @@ struct spinand_info { · 7 unmodified lines | |||
| 613 | unsigned int read_retries; | 623 | unsigned int read_retries; |
| 614 | int (*set_read_retry)(struct spinand_device *spinand, | 624 | int (*set_read_retry)(struct spinand_device *spinand, |
| 615 | unsigned int read_retry); | 625 | unsigned int read_retry); |
| 626 | int (*set_randomizer)(struct spinand_device *spinand, | ||
| 627 | bool enable); | ||
| 616 | }; | 628 | }; |
| 617 | 629 | ||
| 618 | #define SPINAND_ID(__method, ...) \ | 630 | #define SPINAND_ID(__method, ...) \ |
| @@ -629,6 +641,14 @@ struct spinand_info { · 10 unmodified lines | |||
| 629 | .update_cache = __update, \ | 641 | .update_cache = __update, \ |
| 630 | } | 642 | } |
| 631 | 643 | ||
| 644 | #define SPINAND_INFO_OP_VARIANTS_WITH_CONT(__read, __write, __update, __cont_read) \ | ||
| 645 | { \ | ||
| 646 | .read_cache = __read, \ | ||
| 647 | .write_cache = __write, \ | ||
| 648 | .update_cache = __update, \ | ||
| 649 | .cont_read_cache = __cont_read, \ | ||
| 650 | } | ||
| 651 | |||
| 632 | #define SPINAND_INFO_VENDOR_OPS(__ops) \ | 652 | #define SPINAND_INFO_VENDOR_OPS(__ops) \ |
| 633 | .vendor_ops = __ops | 653 | .vendor_ops = __ops |
| 634 | 654 | ||
| @@ -669,6 +689,9 @@ struct spinand_info { · 34 unmodified lines | |||
| 669 | .read_retries = __read_retries, \ | 689 | .read_retries = __read_retries, \ |
| 670 | .set_read_retry = __set_read_retry | 690 | .set_read_retry = __set_read_retry |
| 671 | 691 | ||
| 692 | #define SPINAND_RANDOMIZER(__set_randomizer) \ | ||
| 693 | .set_randomizer = __set_randomizer | ||
| 694 | |||
| 672 | #define SPINAND_INFO(__model, __id, __memorg, __eccreq, __op_variants, \ | 695 | #define SPINAND_INFO(__model, __id, __memorg, __eccreq, __op_variants, \ |
| 673 | __flags, ...) \ | 696 | __flags, ...) \ |
| 674 | { \ | 697 | { \ |
| @@ -684,8 +707,6 @@ struct spinand_info { · 9 unmodified lines | |||
| 684 | struct spinand_dirmap { | 707 | struct spinand_dirmap { |
| 685 | struct spi_mem_dirmap_desc *wdesc; | 708 | struct spi_mem_dirmap_desc *wdesc; |
| 686 | struct spi_mem_dirmap_desc *rdesc; | 709 | struct spi_mem_dirmap_desc *rdesc; |
| 687 | struct spi_mem_dirmap_desc *wdesc_ecc; | ||
| 688 | struct spi_mem_dirmap_desc *rdesc_ecc; | ||
| 689 | }; | 710 | }; |
| 690 | 711 | ||
| 691 | /** | 712 | /** |
| @@ -702,6 +723,7 @@ struct spinand_dirmap { · 10 unmodified lines | |||
| 702 | * @read_cache: read cache op template | 723 | * @read_cache: read cache op template |
| 703 | * @write_cache: write cache op template | 724 | * @write_cache: write cache op template |
| 704 | * @update_cache: update cache op template | 725 | * @update_cache: update cache op template |
| 726 | * @cont_read_cache: continuous read cache op template (optional) | ||
| 705 | */ | 727 | */ |
| 706 | struct spinand_mem_ops { | 728 | struct spinand_mem_ops { |
| 707 | struct spi_mem_op reset; | 729 | struct spi_mem_op reset; |
| @@ -716,6 +738,7 @@ struct spinand_mem_ops { · 8 unmodified lines | |||
| 716 | const struct spi_mem_op *read_cache; | 738 | const struct spi_mem_op *read_cache; |
| 717 | const struct spi_mem_op *write_cache; | 739 | const struct spi_mem_op *write_cache; |
| 718 | const struct spi_mem_op *update_cache; | 740 | const struct spi_mem_op *update_cache; |
| 741 | const struct spi_mem_op *cont_read_cache; | ||
| 719 | }; | 742 | }; |
| 720 | 743 | ||
| 721 | /** | 744 | /** |
| @@ -754,6 +777,7 @@ struct spinand_mem_ops { · 32 unmodified lines | |||
| 754 | * @user_otp: SPI NAND user OTP info. | 777 | * @user_otp: SPI NAND user OTP info. |
| 755 | * @read_retries: the number of read retry modes supported | 778 | * @read_retries: the number of read retry modes supported |
| 756 | * @set_read_retry: Enable/disable the read retry feature | 779 | * @set_read_retry: Enable/disable the read retry feature |
| 780 | * @set_randomizer: Enable/disable the randomizer feature | ||
| 757 | */ | 781 | */ |
| 758 | struct spinand_device { | 782 | struct spinand_device { |
| 759 | struct nand_device base; | 783 | struct nand_device base; |
| @@ -787,6 +811,8 @@ struct spinand_device { · 27 unmodified lines | |||
| 787 | bool cont_read_possible; | 811 | bool cont_read_possible; |
| 788 | int (*set_cont_read)(struct spinand_device *spinand, | 812 | int (*set_cont_read)(struct spinand_device *spinand, |
| 789 | bool enable); | 813 | bool enable); |
| 814 | int (*set_randomizer)(struct spinand_device *spinand, | ||
| 815 | bool enable); | ||
| 790 | 816 | ||
| 791 | const struct spinand_fact_otp *fact_otp; | 817 | const struct spinand_fact_otp *fact_otp; |
| 792 | const struct spinand_user_otp *user_otp; | 818 | const struct spinand_user_otp *user_otp; |
| @@ -862,6 +888,8 @@ static inline void spinand_set_of_node(struct spinand_device *spinand, · 69 unmodified lines | |||
| 862 | nanddev_set_of_node(&spinand->base, np); | 888 | nanddev_set_of_node(&spinand->base, np); |
| 863 | } | 889 | } |
| 864 | 890 | ||
| 891 | bool spinand_op_is_odtr(const struct spi_mem_op *op); | ||
| 892 | |||
| 865 | int spinand_match_and_init(struct spinand_device *spinand, | 893 | int spinand_match_and_init(struct spinand_device *spinand, |
| 866 | const struct spinand_info *table, | 894 | const struct spinand_info *table, |
| 867 | unsigned int table_size, | 895 | unsigned int table_size, |
| @@ -49,9 +49,9 @@ int nvme_auth_augmented_challenge(u8 hmac_id, const u8 *skey, size_t skey_len, · 48 unmodified lines | |||
| 49 | int nvme_auth_gen_privkey(struct crypto_kpp *dh_tfm, u8 dh_gid); | 49 | int nvme_auth_gen_privkey(struct crypto_kpp *dh_tfm, u8 dh_gid); |
| 50 | int nvme_auth_gen_pubkey(struct crypto_kpp *dh_tfm, | 50 | int nvme_auth_gen_pubkey(struct crypto_kpp *dh_tfm, |
| 51 | u8 *host_key, size_t host_key_len); | 51 | u8 *host_key, size_t host_key_len); |
| 52 | int nvme_auth_gen_shared_secret(struct crypto_kpp *dh_tfm, | 52 | int nvme_auth_gen_session_key(struct crypto_kpp *dh_tfm, |
| 53 | const u8 *ctrl_key, size_t ctrl_key_len, | 53 | const u8 *public_key, size_t public_key_len, |
| 54 | u8 *sess_key, size_t sess_key_len); | 54 | u8 *sess_key, size_t sess_key_len, u8 hash_id); |
| 55 | int nvme_auth_generate_psk(u8 hmac_id, const u8 *skey, size_t skey_len, | 55 | int nvme_auth_generate_psk(u8 hmac_id, const u8 *skey, size_t skey_len, |
| 56 | const u8 *c1, const u8 *c2, size_t hash_len, | 56 | const u8 *c1, const u8 *c2, size_t hash_len, |
| 57 | u8 **ret_psk, size_t *ret_len); | 57 | u8 **ret_psk, size_t *ret_len); |
| @@ -261,6 +261,35 @@ static inline void list_replace_rcu(struct list_head *old, · 260 unmodified lines | |||
| 261 | old->prev = LIST_POISON2; | 261 | old->prev = LIST_POISON2; |
| 262 | } | 262 | } |
| 263 | 263 | ||
| 264 | static inline void __list_splice_rcu(struct list_head *list, | ||
| 265 | struct list_head *prev, | ||
| 266 | struct list_head *next) | ||
| 267 | { | ||
| 268 | struct list_head *first = list->next; | ||
| 269 | struct list_head *last = list->prev; | ||
| 270 | |||
| 271 | last->next = next; | ||
| 272 | first->prev = prev; | ||
| 273 | next->prev = last; | ||
| 274 | rcu_assign_pointer(list_next_rcu(prev), first); | ||
| 275 | } | ||
| 276 | |||
| 277 | /** | ||
| 278 | * list_splice_rcu - splice a non-RCU list into an RCU-protected list, | ||
| 279 | * designed for stacks. | ||
| 280 | * @list: the non RCU-protected list to splice | ||
| 281 | * @head: the place in the existing RCU-protected list to splice | ||
| 282 | * | ||
| 283 | * The list pointed to by @head can be RCU-read traversed concurrently with | ||
| 284 | * this function. | ||
| 285 | */ | ||
| 286 | static inline void list_splice_rcu(struct list_head *list, | ||
| 287 | struct list_head *head) | ||
| 288 | { | ||
| 289 | if (!list_empty(list)) | ||
| 290 | __list_splice_rcu(list, head, head->next); | ||
| 291 | } | ||
| 292 | |||
| 264 | /** | 293 | /** |
| 265 | * __list_splice_init_rcu - join an RCU-protected list into an existing list. | 294 | * __list_splice_init_rcu - join an RCU-protected list into an existing list. |
| 266 | * @list: the RCU-protected list to splice | 295 | * @list: the RCU-protected list to splice |
| @@ -12,6 +12,7 @@ · 11 unmodified lines | |||
| 12 | #include <linux/alloc_tag.h> | 12 | #include <linux/alloc_tag.h> |
| 13 | #include <linux/atomic.h> | 13 | #include <linux/atomic.h> |
| 14 | #include <linux/compiler.h> | 14 | #include <linux/compiler.h> |
| 15 | #include <linux/irq_work_types.h> | ||
| 15 | #include <linux/mutex.h> | 16 | #include <linux/mutex.h> |
| 16 | #include <linux/workqueue_types.h> | 17 | #include <linux/workqueue_types.h> |
| 17 | 18 | ||
| @@ -49,6 +50,7 @@ typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *arg, · 31 unmodified lines | |||
| 49 | * @head_offset: Offset of rhash_head in struct to be hashed | 50 | * @head_offset: Offset of rhash_head in struct to be hashed |
| 50 | * @max_size: Maximum size while expanding | 51 | * @max_size: Maximum size while expanding |
| 51 | * @min_size: Minimum size while shrinking | 52 | * @min_size: Minimum size while shrinking |
| 53 | * @insecure_elasticity: Set to true to disable chain length checks | ||
| 52 | * @automatic_shrinking: Enable automatic shrinking of tables | 54 | * @automatic_shrinking: Enable automatic shrinking of tables |
| 53 | * @hashfn: Hash function (default: jhash2 if !(key_len % 4), or jhash) | 55 | * @hashfn: Hash function (default: jhash2 if !(key_len % 4), or jhash) |
| 54 | * @obj_hashfn: Function to hash object | 56 | * @obj_hashfn: Function to hash object |
| @@ -61,6 +63,7 @@ struct rhashtable_params { · 6 unmodified lines | |||
| 61 | u16 head_offset; | 63 | u16 head_offset; |
| 62 | unsigned int max_size; | 64 | unsigned int max_size; |
| 63 | u16 min_size; | 65 | u16 min_size; |
| 66 | bool insecure_elasticity; | ||
| 64 | bool automatic_shrinking; | 67 | bool automatic_shrinking; |
| 65 | rht_hashfn_t hashfn; | 68 | rht_hashfn_t hashfn; |
| 66 | rht_obj_hashfn_t obj_hashfn; | 69 | rht_obj_hashfn_t obj_hashfn; |
| @@ -75,6 +78,7 @@ struct rhashtable_params { · 8 unmodified lines | |||
| 75 | * @p: Configuration parameters | 78 | * @p: Configuration parameters |
| 76 | * @rhlist: True if this is an rhltable | 79 | * @rhlist: True if this is an rhltable |
| 77 | * @run_work: Deferred worker to expand/shrink asynchronously | 80 | * @run_work: Deferred worker to expand/shrink asynchronously |
| 81 | * @run_irq_work: Bounces the @run_work kick through hard IRQ context. | ||
| 78 | * @mutex: Mutex to protect current/future table swapping | 82 | * @mutex: Mutex to protect current/future table swapping |
| 79 | * @lock: Spin lock to protect walker list | 83 | * @lock: Spin lock to protect walker list |
| 80 | * @nelems: Number of elements in table | 84 | * @nelems: Number of elements in table |
| @@ -86,6 +90,7 @@ struct rhashtable { · 5 unmodified lines | |||
| 86 | struct rhashtable_params p; | 90 | struct rhashtable_params p; |
| 87 | bool rhlist; | 91 | bool rhlist; |
| 88 | struct work_struct run_work; | 92 | struct work_struct run_work; |
| 93 | struct irq_work run_irq_work; | ||
| 89 | struct mutex mutex; | 94 | struct mutex mutex; |
| 90 | spinlock_t lock; | 95 | spinlock_t lock; |
| 91 | atomic_t nelems; | 96 | atomic_t nelems; |
| @@ -20,6 +20,7 @@ · 19 unmodified lines | |||
| 20 | 20 | ||
| 21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
| 22 | #include <linux/errno.h> | 22 | #include <linux/errno.h> |
| 23 | #include <linux/irq_work.h> | ||
| 23 | #include <linux/jhash.h> | 24 | #include <linux/jhash.h> |
| 24 | #include <linux/list_nulls.h> | 25 | #include <linux/list_nulls.h> |
| 25 | #include <linux/workqueue.h> | 26 | #include <linux/workqueue.h> |
| @@ -821,14 +822,15 @@ slow_path: · 795 unmodified lines | |||
| 821 | goto out; | 822 | goto out; |
| 822 | } | 823 | } |
| 823 | 824 | ||
| 824 | if (elasticity <= 0) | 825 | if (elasticity <= 0 && !params.insecure_elasticity) |
| 825 | goto slow_path; | 826 | goto slow_path; |
| 826 | 827 | ||
| 827 | data = ERR_PTR(-E2BIG); | 828 | data = ERR_PTR(-E2BIG); |
| 828 | if (unlikely(rht_grow_above_max(ht, tbl))) | 829 | if (unlikely(rht_grow_above_max(ht, tbl))) |
| 829 | goto out_unlock; | 830 | goto out_unlock; |
| 830 | 831 | ||
| 831 | if (unlikely(rht_grow_above_100(ht, tbl))) | 832 | if (unlikely(rht_grow_above_100(ht, tbl)) && |
| 833 | !params.insecure_elasticity) | ||
| 832 | goto slow_path; | 834 | goto slow_path; |
| 833 | 835 | ||
| 834 | /* Inserting at head of list makes unlocking free. */ | 836 | /* Inserting at head of list makes unlocking free. */ |
| @@ -846,7 +848,7 @@ slow_path: · 11 unmodified lines | |||
| 846 | rht_assign_unlock(tbl, bkt, obj, flags); | 848 | rht_assign_unlock(tbl, bkt, obj, flags); |
| 847 | 849 | ||
| 848 | if (rht_grow_above_75(ht, tbl)) | 850 | if (rht_grow_above_75(ht, tbl)) |
| 849 | schedule_work(&ht->run_work); | 851 | irq_work_queue(&ht->run_irq_work); |
| 850 | 852 | ||
| 851 | data = NULL; | 853 | data = NULL; |
| 852 | out: | 854 | out: |
| @@ -227,6 +227,8 @@ struct spi_mem_op { · 226 unmodified lines | |||
| 227 | * struct spi_mem_dirmap_info - Direct mapping information | 227 | * struct spi_mem_dirmap_info - Direct mapping information |
| 228 | * @op_tmpl: operation template that should be used by the direct mapping when | 228 | * @op_tmpl: operation template that should be used by the direct mapping when |
| 229 | * the memory device is accessed | 229 | * the memory device is accessed |
| 230 | * @secondary_op_tmpl: secondary template, may be used as an alternative to the | ||
| 231 | * primary template (decided by the upper layer) | ||
| 230 | * @offset: absolute offset this direct mapping is pointing to | 232 | * @offset: absolute offset this direct mapping is pointing to |
| 231 | * @length: length in byte of this direct mapping | 233 | * @length: length in byte of this direct mapping |
| 232 | * | 234 | * |
| @@ -237,7 +239,9 @@ struct spi_mem_op { · 4 unmodified lines | |||
| 237 | * direction is directly encoded in the ->op_tmpl.data.dir field. | 239 | * direction is directly encoded in the ->op_tmpl.data.dir field. |
| 238 | */ | 240 | */ |
| 239 | struct spi_mem_dirmap_info { | 241 | struct spi_mem_dirmap_info { |
| 240 | struct spi_mem_op op_tmpl; | 242 | struct spi_mem_op *op_tmpl; |
| 243 | struct spi_mem_op primary_op_tmpl; | ||
| 244 | struct spi_mem_op secondary_op_tmpl; | ||
| 241 | u64 offset; | 245 | u64 offset; |
| 242 | u64 length; | 246 | u64 length; |
| 243 | }; | 247 | }; |
| @@ -381,12 +385,18 @@ struct spi_controller_mem_ops { · 137 unmodified lines | |||
| 381 | * @swap16: Supports swapping bytes on a 16 bit boundary when configured in | 385 | * @swap16: Supports swapping bytes on a 16 bit boundary when configured in |
| 382 | * Octal DTR | 386 | * Octal DTR |
| 383 | * @per_op_freq: Supports per operation frequency switching | 387 | * @per_op_freq: Supports per operation frequency switching |
| 388 | * @no_cs_assertion: The controller may automatically deassert the CS if there | ||
| 389 | * is a pause in the transfer (eg. internal bus contention or | ||
| 390 | * DMA arbitration on an interconnect). Features such as NAND | ||
| 391 | * continuous reads shall not be leveraged. | ||
| 384 | */ | 392 | */ |
| 385 | struct spi_controller_mem_caps { | 393 | struct spi_controller_mem_caps { |
| 386 | bool dtr; | 394 | bool dtr; |
| 387 | bool ecc; | 395 | bool ecc; |
| 388 | bool swap16; | 396 | bool swap16; |
| 389 | bool per_op_freq; | 397 | bool per_op_freq; |
| 398 | bool secondary_op_tmpl; | ||
| 399 | bool no_cs_assertion; | ||
| 390 | }; | 400 | }; |
| 391 | 401 | ||
| 392 | #define spi_mem_controller_is_capable(ctlr, cap) \ | 402 | #define spi_mem_controller_is_capable(ctlr, cap) \ |
| @@ -202,7 +202,7 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) · 201 unmodified lines | |||
| 202 | #define TP_CONDITION(args...) args | 202 | #define TP_CONDITION(args...) args |
| 203 | 203 | ||
| 204 | /* | 204 | /* |
| 205 | * Individual subsystem my have a separate configuration to | 205 | * Individual subsystem may have a separate configuration to |
| 206 | * enable their tracepoints. By default, this file will create | 206 | * enable their tracepoints. By default, this file will create |
| 207 | * the tracepoints if CONFIG_TRACEPOINTS is defined. If a subsystem | 207 | * the tracepoints if CONFIG_TRACEPOINTS is defined. If a subsystem |
| 208 | * wants to be able to disable its tracepoints from being created | 208 | * wants to be able to disable its tracepoints from being created |
| @@ -243,7 +243,7 @@ typedef struct port { · 242 unmodified lines | |||
| 243 | churn_state_t sm_churn_actor_state; | 243 | churn_state_t sm_churn_actor_state; |
| 244 | churn_state_t sm_churn_partner_state; | 244 | churn_state_t sm_churn_partner_state; |
| 245 | struct slave *slave; /* pointer to the bond slave that this port belongs to */ | 245 | struct slave *slave; /* pointer to the bond slave that this port belongs to */ |
| 246 | struct aggregator *aggregator; /* pointer to an aggregator that this port related to */ | 246 | struct aggregator __rcu *aggregator; /* pointer to an aggregator that this port related to */ |
| 247 | struct port *next_port_in_aggregator; /* Next port on the linked list of the parent aggregator */ | 247 | struct port *next_port_in_aggregator; /* Next port on the linked list of the parent aggregator */ |
| 248 | u32 transaction_id; /* continuous number for identification of Marker PDU's; */ | 248 | u32 transaction_id; /* continuous number for identification of Marker PDU's; */ |
| 249 | struct lacpdu lacpdu; /* the lacpdu that will be sent for this port */ | 249 | struct lacpdu lacpdu; /* the lacpdu that will be sent for this port */ |
| @@ -1204,12 +1204,15 @@ struct nft_stats { · 1203 unmodified lines | |||
| 1204 | struct u64_stats_sync syncp; | 1204 | struct u64_stats_sync syncp; |
| 1205 | }; | 1205 | }; |
| 1206 | 1206 | ||
| 1207 | #define NFT_HOOK_REMOVE (1 << 0) | ||
| 1208 | |||
| 1207 | struct nft_hook { | 1209 | struct nft_hook { |
| 1208 | struct list_head list; | 1210 | struct list_head list; |
| 1209 | struct list_head ops_list; | 1211 | struct list_head ops_list; |
| 1210 | struct rcu_head rcu; | 1212 | struct rcu_head rcu; |
| 1211 | char ifname[IFNAMSIZ]; | 1213 | char ifname[IFNAMSIZ]; |
| 1212 | u8 ifnamelen; | 1214 | u8 ifnamelen; |
| 1215 | u8 flags; | ||
| 1213 | }; | 1216 | }; |
| 1214 | 1217 | ||
| 1215 | struct nf_hook_ops *nft_hook_find_ops(const struct nft_hook *hook, | 1218 | struct nf_hook_ops *nft_hook_find_ops(const struct nft_hook *hook, |
| @@ -1664,6 +1667,16 @@ struct nft_trans { · 448 unmodified lines | |||
| 1664 | u8 put_net:1; | 1667 | u8 put_net:1; |
| 1665 | }; | 1668 | }; |
| 1666 | 1669 | ||
| 1670 | /** | ||
| 1671 | * struct nft_trans_hook - nf_tables hook update in transaction | ||
| 1672 | * @list: used internally | ||
| 1673 | * @hook: struct nft_hook with the device hook | ||
| 1674 | */ | ||
| 1675 | struct nft_trans_hook { | ||
| 1676 | struct list_head list; | ||
| 1677 | struct nft_hook *hook; | ||
| 1678 | }; | ||
| 1679 | |||
| 1667 | /** | 1680 | /** |
| 1668 | * struct nft_trans_binding - nf_tables object with binding support in transaction | 1681 | * struct nft_trans_binding - nf_tables object with binding support in transaction |
| 1669 | * @nft_trans: base structure, MUST be first member | 1682 | * @nft_trans: base structure, MUST be first member |
| @@ -127,6 +127,21 @@ static inline unsigned int net_iov_idx(const struct net_iov *niov) · 126 unmodified lines | |||
| 127 | return niov - net_iov_owner(niov)->niovs; | 127 | return niov - net_iov_owner(niov)->niovs; |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | /* Initialize a niov: stamp the owning area, the memory provider type, | ||
| 131 | * and the page_type "no type" sentinel expected by the page-type API | ||
| 132 | * (see PAGE_TYPE_OPS in <linux/page-flags.h>) so that | ||
| 133 | * page_pool_set_pp_info() can later call __SetPageNetpp() on a niov | ||
| 134 | * cast to struct page. | ||
| 135 | */ | ||
| 136 | static inline void net_iov_init(struct net_iov *niov, | ||
| 137 | struct net_iov_area *owner, | ||
| 138 | enum net_iov_type type) | ||
| 139 | { | ||
| 140 | niov->owner = owner; | ||
| 141 | niov->type = type; | ||
| 142 | niov->page_type = UINT_MAX; | ||
| 143 | } | ||
| 144 | |||
| 130 | /* netmem */ | 145 | /* netmem */ |
| 131 | 146 | ||
| 132 | /** | 147 | /** |
| @@ -905,7 +905,8 @@ struct io_uring_buf_reg { · 904 unmodified lines | |||
| 905 | __u32 ring_entries; | 905 | __u32 ring_entries; |
| 906 | __u16 bgid; | 906 | __u16 bgid; |
| 907 | __u16 flags; | 907 | __u16 flags; |
| 908 | __u64 resv[3]; | 908 | __u32 min_left; |
| 909 | __u32 resv[5]; | ||
| 909 | }; | 910 | }; |
| 910 | 911 | ||
| 911 | /* argument for IORING_REGISTER_PBUF_STATUS */ | 912 | /* argument for IORING_REGISTER_PBUF_STATUS */ |