Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'char-misc-5.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Pull char/misc driver fixes from Greg KH:
"Here are some small char and misc driver fixes for 5.15-rc3.

Nothing huge in here, just fixes for a number of small issues that
have been reported. These include:

- habanalabs race conditions and other bugs fixed

- binder driver fixes

- fpga driver fixes

- coresight build warning fix

- nvmem driver fix

- comedi memory leak fix

- bcm-vk tty race fix

- other tiny driver fixes

All of these have been in linux-next for a while with no reported
issues"

* tag 'char-misc-5.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (21 commits)
comedi: Fix memory leak in compat_insnlist()
nvmem: NVMEM_NINTENDO_OTP should depend on WII
misc: bcm-vk: fix tty registration race
fpga: dfl: Avoid reads to AFU CSRs during enumeration
fpga: machxo2-spi: Fix missing error code in machxo2_write_complete()
fpga: machxo2-spi: Return an error on failure
habanalabs: expose a single cs seq in staged submissions
habanalabs: fix wait offset handling
habanalabs: rate limit multi CS completion errors
habanalabs/gaudi: fix LBW RR configuration
habanalabs: Fix spelling mistake "FEADBACK" -> "FEEDBACK"
habanalabs: fail collective wait when not supported
habanalabs/gaudi: use direct MSI in single mode
habanalabs: fix kernel OOPs related to staged cs
habanalabs: fix potential race in interrupt wait ioctl
mcb: fix error handling in mcb_alloc_bus()
misc: genwqe: Fixes DMA mask setting
coresight: syscfg: Fix compiler warning
nvmem: core: Add stubs for nvmem_cell_read_variable_le_u32/64 if !CONFIG_NVMEM
binder: make sure fd closes complete
...

+229 -103
+46 -12
drivers/android/binder.c
··· 1852 1852 } 1853 1853 1854 1854 static void binder_transaction_buffer_release(struct binder_proc *proc, 1855 + struct binder_thread *thread, 1855 1856 struct binder_buffer *buffer, 1856 1857 binder_size_t failed_at, 1857 1858 bool is_failure) ··· 2012 2011 &proc->alloc, &fd, buffer, 2013 2012 offset, sizeof(fd)); 2014 2013 WARN_ON(err); 2015 - if (!err) 2014 + if (!err) { 2016 2015 binder_deferred_fd_close(fd); 2016 + /* 2017 + * Need to make sure the thread goes 2018 + * back to userspace to complete the 2019 + * deferred close 2020 + */ 2021 + if (thread) 2022 + thread->looper_need_return = true; 2023 + } 2017 2024 } 2018 2025 } break; 2019 2026 default: ··· 3047 3038 if (reply) { 3048 3039 binder_enqueue_thread_work(thread, tcomplete); 3049 3040 binder_inner_proc_lock(target_proc); 3050 - if (target_thread->is_dead || target_proc->is_frozen) { 3051 - return_error = target_thread->is_dead ? 3052 - BR_DEAD_REPLY : BR_FROZEN_REPLY; 3041 + if (target_thread->is_dead) { 3042 + return_error = BR_DEAD_REPLY; 3053 3043 binder_inner_proc_unlock(target_proc); 3054 3044 goto err_dead_proc_or_thread; 3055 3045 } ··· 3113 3105 err_copy_data_failed: 3114 3106 binder_free_txn_fixups(t); 3115 3107 trace_binder_transaction_failed_buffer_release(t->buffer); 3116 - binder_transaction_buffer_release(target_proc, t->buffer, 3108 + binder_transaction_buffer_release(target_proc, NULL, t->buffer, 3117 3109 buffer_offset, true); 3118 3110 if (target_node) 3119 3111 binder_dec_node_tmpref(target_node); ··· 3192 3184 * Cleanup buffer and free it. 3193 3185 */ 3194 3186 static void 3195 - binder_free_buf(struct binder_proc *proc, struct binder_buffer *buffer) 3187 + binder_free_buf(struct binder_proc *proc, 3188 + struct binder_thread *thread, 3189 + struct binder_buffer *buffer) 3196 3190 { 3197 3191 binder_inner_proc_lock(proc); 3198 3192 if (buffer->transaction) { ··· 3222 3212 binder_node_inner_unlock(buf_node); 3223 3213 } 3224 3214 trace_binder_transaction_buffer_release(buffer); 3225 - binder_transaction_buffer_release(proc, buffer, 0, false); 3215 + binder_transaction_buffer_release(proc, thread, buffer, 0, false); 3226 3216 binder_alloc_free_buf(&proc->alloc, buffer); 3227 3217 } 3228 3218 ··· 3424 3414 proc->pid, thread->pid, (u64)data_ptr, 3425 3415 buffer->debug_id, 3426 3416 buffer->transaction ? "active" : "finished"); 3427 - binder_free_buf(proc, buffer); 3417 + binder_free_buf(proc, thread, buffer); 3428 3418 break; 3429 3419 } 3430 3420 ··· 4117 4107 buffer->transaction = NULL; 4118 4108 binder_cleanup_transaction(t, "fd fixups failed", 4119 4109 BR_FAILED_REPLY); 4120 - binder_free_buf(proc, buffer); 4110 + binder_free_buf(proc, thread, buffer); 4121 4111 binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, 4122 4112 "%d:%d %stransaction %d fd fixups failed %d/%d, line %d\n", 4123 4113 proc->pid, thread->pid, ··· 4658 4648 return 0; 4659 4649 } 4660 4650 4651 + static bool binder_txns_pending_ilocked(struct binder_proc *proc) 4652 + { 4653 + struct rb_node *n; 4654 + struct binder_thread *thread; 4655 + 4656 + if (proc->outstanding_txns > 0) 4657 + return true; 4658 + 4659 + for (n = rb_first(&proc->threads); n; n = rb_next(n)) { 4660 + thread = rb_entry(n, struct binder_thread, rb_node); 4661 + if (thread->transaction_stack) 4662 + return true; 4663 + } 4664 + return false; 4665 + } 4666 + 4661 4667 static int binder_ioctl_freeze(struct binder_freeze_info *info, 4662 4668 struct binder_proc *target_proc) 4663 4669 { ··· 4705 4679 (!target_proc->outstanding_txns), 4706 4680 msecs_to_jiffies(info->timeout_ms)); 4707 4681 4708 - if (!ret && target_proc->outstanding_txns) 4709 - ret = -EAGAIN; 4682 + /* Check pending transactions that wait for reply */ 4683 + if (ret >= 0) { 4684 + binder_inner_proc_lock(target_proc); 4685 + if (binder_txns_pending_ilocked(target_proc)) 4686 + ret = -EAGAIN; 4687 + binder_inner_proc_unlock(target_proc); 4688 + } 4710 4689 4711 4690 if (ret < 0) { 4712 4691 binder_inner_proc_lock(target_proc); ··· 4727 4696 { 4728 4697 struct binder_proc *target_proc; 4729 4698 bool found = false; 4699 + __u32 txns_pending; 4730 4700 4731 4701 info->sync_recv = 0; 4732 4702 info->async_recv = 0; ··· 4737 4705 if (target_proc->pid == info->pid) { 4738 4706 found = true; 4739 4707 binder_inner_proc_lock(target_proc); 4740 - info->sync_recv |= target_proc->sync_recv; 4708 + txns_pending = binder_txns_pending_ilocked(target_proc); 4709 + info->sync_recv |= target_proc->sync_recv | 4710 + (txns_pending << 1); 4741 4711 info->async_recv |= target_proc->async_recv; 4742 4712 binder_inner_proc_unlock(target_proc); 4743 4713 }
+2
drivers/android/binder_internal.h
··· 378 378 * binder transactions 379 379 * (protected by @inner_lock) 380 380 * @sync_recv: process received sync transactions since last frozen 381 + * bit 0: received sync transaction after being frozen 382 + * bit 1: new pending sync transaction during freezing 381 383 * (protected by @inner_lock) 382 384 * @async_recv: process received async transactions since last frozen 383 385 * (protected by @inner_lock)
+1
drivers/comedi/comedi_fops.c
··· 3090 3090 mutex_lock(&dev->mutex); 3091 3091 rc = do_insnlist_ioctl(dev, insns, insnlist32.n_insns, file); 3092 3092 mutex_unlock(&dev->mutex); 3093 + kfree(insns); 3093 3094 return rc; 3094 3095 } 3095 3096
+8 -6
drivers/fpga/dfl.c
··· 1019 1019 { 1020 1020 unsigned int irq_base, nr_irqs; 1021 1021 struct dfl_feature_info *finfo; 1022 + u8 revision = 0; 1022 1023 int ret; 1023 - u8 revision; 1024 1024 u64 v; 1025 1025 1026 - v = readq(binfo->ioaddr + ofst); 1027 - revision = FIELD_GET(DFH_REVISION, v); 1026 + if (fid != FEATURE_ID_AFU) { 1027 + v = readq(binfo->ioaddr + ofst); 1028 + revision = FIELD_GET(DFH_REVISION, v); 1028 1029 1029 - /* read feature size and id if inputs are invalid */ 1030 - size = size ? size : feature_size(v); 1031 - fid = fid ? fid : feature_id(v); 1030 + /* read feature size and id if inputs are invalid */ 1031 + size = size ? size : feature_size(v); 1032 + fid = fid ? fid : feature_id(v); 1033 + } 1032 1034 1033 1035 if (binfo->len - ofst < size) 1034 1036 return -EINVAL;
+5 -1
drivers/fpga/machxo2-spi.c
··· 225 225 goto fail; 226 226 227 227 get_status(spi, &status); 228 - if (test_bit(FAIL, &status)) 228 + if (test_bit(FAIL, &status)) { 229 + ret = -EINVAL; 229 230 goto fail; 231 + } 230 232 dump_status_reg(&status); 231 233 232 234 spi_message_init(&msg); ··· 315 313 dump_status_reg(&status); 316 314 if (!test_bit(DONE, &status)) { 317 315 machxo2_cleanup(mgr); 316 + ret = -EINVAL; 318 317 goto fail; 319 318 } 320 319 ··· 338 335 break; 339 336 if (++refreshloop == MACHXO2_MAX_REFRESH_LOOP) { 340 337 machxo2_cleanup(mgr); 338 + ret = -EINVAL; 341 339 goto fail; 342 340 } 343 341 } while (1);
+1
drivers/hwtracing/coresight/coresight-syscfg.c
··· 5 5 */ 6 6 7 7 #include <linux/platform_device.h> 8 + #include <linux/slab.h> 8 9 9 10 #include "coresight-config.h" 10 11 #include "coresight-etm-perf.h"
+6 -6
drivers/mcb/mcb-core.c
··· 275 275 276 276 bus_nr = ida_simple_get(&mcb_ida, 0, 0, GFP_KERNEL); 277 277 if (bus_nr < 0) { 278 - rc = bus_nr; 279 - goto err_free; 278 + kfree(bus); 279 + return ERR_PTR(bus_nr); 280 280 } 281 281 282 282 bus->bus_nr = bus_nr; ··· 291 291 dev_set_name(&bus->dev, "mcb:%d", bus_nr); 292 292 rc = device_add(&bus->dev); 293 293 if (rc) 294 - goto err_free; 294 + goto err_put; 295 295 296 296 return bus; 297 - err_free: 298 - put_device(carrier); 299 - kfree(bus); 297 + 298 + err_put: 299 + put_device(&bus->dev); 300 300 return ERR_PTR(rc); 301 301 } 302 302 EXPORT_SYMBOL_NS_GPL(mcb_alloc_bus, MCB);
+3 -3
drivers/misc/bcm-vk/bcm_vk_tty.c
··· 267 267 struct device *tty_dev; 268 268 269 269 tty_port_init(&vk->tty[i].port); 270 - tty_dev = tty_port_register_device(&vk->tty[i].port, tty_drv, 271 - i, dev); 270 + tty_dev = tty_port_register_device_attr(&vk->tty[i].port, 271 + tty_drv, i, dev, vk, 272 + NULL); 272 273 if (IS_ERR(tty_dev)) { 273 274 err = PTR_ERR(tty_dev); 274 275 goto unwind; 275 276 } 276 - dev_set_drvdata(tty_dev, vk); 277 277 vk->tty[i].is_opened = false; 278 278 } 279 279
+1 -1
drivers/misc/genwqe/card_base.c
··· 1090 1090 1091 1091 /* check for 64-bit DMA address supported (DAC) */ 1092 1092 /* check for 32-bit DMA address supported (SAC) */ 1093 - if (dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64)) || 1093 + if (dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64)) && 1094 1094 dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32))) { 1095 1095 dev_err(&pci_dev->dev, 1096 1096 "err: neither DMA32 nor DMA64 supported\n");
+51 -20
drivers/misc/habanalabs/common/command_submission.c
··· 405 405 static void cs_handle_tdr(struct hl_device *hdev, struct hl_cs *cs) 406 406 { 407 407 bool next_entry_found = false; 408 - struct hl_cs *next; 408 + struct hl_cs *next, *first_cs; 409 409 410 410 if (!cs_needs_timeout(cs)) 411 411 return; ··· 415 415 /* We need to handle tdr only once for the complete staged submission. 416 416 * Hence, we choose the CS that reaches this function first which is 417 417 * the CS marked as 'staged_last'. 418 + * In case single staged cs was submitted which has both first and last 419 + * indications, then "cs_find_first" below will return NULL, since we 420 + * removed the cs node from the list before getting here, 421 + * in such cases just continue with the cs to cancel it's TDR work. 418 422 */ 419 - if (cs->staged_cs && cs->staged_last) 420 - cs = hl_staged_cs_find_first(hdev, cs->staged_sequence); 423 + if (cs->staged_cs && cs->staged_last) { 424 + first_cs = hl_staged_cs_find_first(hdev, cs->staged_sequence); 425 + if (first_cs) 426 + cs = first_cs; 427 + } 421 428 422 429 spin_unlock(&hdev->cs_mirror_lock); 423 430 ··· 1295 1288 if (rc) 1296 1289 goto free_cs_object; 1297 1290 1291 + /* If this is a staged submission we must return the staged sequence 1292 + * rather than the internal CS sequence 1293 + */ 1294 + if (cs->staged_cs) 1295 + *cs_seq = cs->staged_sequence; 1296 + 1298 1297 /* Validate ALL the CS chunks before submitting the CS */ 1299 1298 for (i = 0 ; i < num_chunks ; i++) { 1300 1299 struct hl_cs_chunk *chunk = &cs_chunk_array[i]; ··· 2001 1988 goto free_cs_chunk_array; 2002 1989 } 2003 1990 1991 + if (!hdev->nic_ports_mask) { 1992 + atomic64_inc(&ctx->cs_counters.validation_drop_cnt); 1993 + atomic64_inc(&cntr->validation_drop_cnt); 1994 + dev_err(hdev->dev, 1995 + "Collective operations not supported when NIC ports are disabled"); 1996 + rc = -EINVAL; 1997 + goto free_cs_chunk_array; 1998 + } 1999 + 2004 2000 collective_engine_id = chunk->collective_engine_id; 2005 2001 } 2006 2002 ··· 2048 2026 spin_unlock(&ctx->sig_mgr.lock); 2049 2027 2050 2028 if (!handle_found) { 2051 - dev_err(hdev->dev, "Cannot find encapsulated signals handle for seq 0x%llx\n", 2029 + /* treat as signal CS already finished */ 2030 + dev_dbg(hdev->dev, "Cannot find encapsulated signals handle for seq 0x%llx\n", 2052 2031 signal_seq); 2053 - rc = -EINVAL; 2032 + rc = 0; 2054 2033 goto free_cs_chunk_array; 2055 2034 } 2056 2035 ··· 2636 2613 * completed after the poll function. 2637 2614 */ 2638 2615 if (!mcs_data.completion_bitmap) { 2639 - dev_err(hdev->dev, "Multi-CS got completion on wait but no CS completed\n"); 2616 + dev_warn_ratelimited(hdev->dev, 2617 + "Multi-CS got completion on wait but no CS completed\n"); 2640 2618 rc = -EFAULT; 2641 2619 } 2642 2620 } ··· 2764 2740 else 2765 2741 interrupt = &hdev->user_interrupt[interrupt_offset]; 2766 2742 2743 + /* Add pending user interrupt to relevant list for the interrupt 2744 + * handler to monitor 2745 + */ 2746 + spin_lock_irqsave(&interrupt->wait_list_lock, flags); 2747 + list_add_tail(&pend->wait_list_node, &interrupt->wait_list_head); 2748 + spin_unlock_irqrestore(&interrupt->wait_list_lock, flags); 2749 + 2750 + /* We check for completion value as interrupt could have been received 2751 + * before we added the node to the wait list 2752 + */ 2767 2753 if (copy_from_user(&completion_value, u64_to_user_ptr(user_address), 4)) { 2768 2754 dev_err(hdev->dev, "Failed to copy completion value from user\n"); 2769 2755 rc = -EFAULT; 2770 - goto free_fence; 2756 + goto remove_pending_user_interrupt; 2771 2757 } 2772 2758 2773 2759 if (completion_value >= target_value) ··· 2786 2752 *status = CS_WAIT_STATUS_BUSY; 2787 2753 2788 2754 if (!timeout_us || (*status == CS_WAIT_STATUS_COMPLETED)) 2789 - goto free_fence; 2790 - 2791 - /* Add pending user interrupt to relevant list for the interrupt 2792 - * handler to monitor 2793 - */ 2794 - spin_lock_irqsave(&interrupt->wait_list_lock, flags); 2795 - list_add_tail(&pend->wait_list_node, &interrupt->wait_list_head); 2796 - spin_unlock_irqrestore(&interrupt->wait_list_lock, flags); 2755 + goto remove_pending_user_interrupt; 2797 2756 2798 2757 wait_again: 2799 2758 /* Wait for interrupt handler to signal completion */ ··· 2797 2770 * If comparison fails, keep waiting until timeout expires 2798 2771 */ 2799 2772 if (completion_rc > 0) { 2773 + spin_lock_irqsave(&interrupt->wait_list_lock, flags); 2774 + /* reinit_completion must be called before we check for user 2775 + * completion value, otherwise, if interrupt is received after 2776 + * the comparison and before the next wait_for_completion, 2777 + * we will reach timeout and fail 2778 + */ 2779 + reinit_completion(&pend->fence.completion); 2780 + spin_unlock_irqrestore(&interrupt->wait_list_lock, flags); 2781 + 2800 2782 if (copy_from_user(&completion_value, u64_to_user_ptr(user_address), 4)) { 2801 2783 dev_err(hdev->dev, "Failed to copy completion value from user\n"); 2802 2784 rc = -EFAULT; ··· 2816 2780 if (completion_value >= target_value) { 2817 2781 *status = CS_WAIT_STATUS_COMPLETED; 2818 2782 } else { 2819 - spin_lock_irqsave(&interrupt->wait_list_lock, flags); 2820 - reinit_completion(&pend->fence.completion); 2821 2783 timeout = completion_rc; 2822 - 2823 - spin_unlock_irqrestore(&interrupt->wait_list_lock, flags); 2824 2784 goto wait_again; 2825 2785 } 2826 2786 } else if (completion_rc == -ERESTARTSYS) { ··· 2834 2802 list_del(&pend->wait_list_node); 2835 2803 spin_unlock_irqrestore(&interrupt->wait_list_lock, flags); 2836 2804 2837 - free_fence: 2838 2805 kfree(pend); 2839 2806 hl_ctx_put(ctx); 2840 2807
+7 -2
drivers/misc/habanalabs/common/hw_queue.c
··· 437 437 struct hl_cs_compl *cs_cmpl) 438 438 { 439 439 struct hl_cs_encaps_sig_handle *handle = cs->encaps_sig_hdl; 440 + u32 offset = 0; 440 441 441 442 cs_cmpl->hw_sob = handle->hw_sob; 442 443 ··· 447 446 * set offset 1 for example he mean to wait only for the first 448 447 * signal only, which will be pre_sob_val, and if he set offset 2 449 448 * then the value required is (pre_sob_val + 1) and so on... 449 + * if user set wait offset to 0, then treat it as legacy wait cs, 450 + * wait for the next signal. 450 451 */ 451 - cs_cmpl->sob_val = handle->pre_sob_val + 452 - (job->encaps_sig_wait_offset - 1); 452 + if (job->encaps_sig_wait_offset) 453 + offset = job->encaps_sig_wait_offset - 1; 454 + 455 + cs_cmpl->sob_val = handle->pre_sob_val + offset; 453 456 } 454 457 455 458 static int init_wait_cs(struct hl_device *hdev, struct hl_cs *cs,
+7 -4
drivers/misc/habanalabs/gaudi/gaudi.c
··· 395 395 396 396 static struct hl_hw_obj_name_entry gaudi_monitor_id_to_str[] = { 397 397 { .id = 200, .name = "MON_OBJ_DMA_DOWN_FEEDBACK_RESET" }, 398 - { .id = 201, .name = "MON_OBJ_DMA_UP_FEADBACK_RESET" }, 398 + { .id = 201, .name = "MON_OBJ_DMA_UP_FEEDBACK_RESET" }, 399 399 { .id = 203, .name = "MON_OBJ_DRAM_TO_SRAM_QUEUE_FENCE" }, 400 400 { .id = 204, .name = "MON_OBJ_TPC_0_CLK_GATE" }, 401 401 { .id = 205, .name = "MON_OBJ_TPC_1_CLK_GATE" }, ··· 5802 5802 { 5803 5803 struct gaudi_device *gaudi = hdev->asic_specific; 5804 5804 struct packet_msg_prot *cq_pkt; 5805 + u64 msi_addr; 5805 5806 u32 tmp; 5806 5807 5807 5808 cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2); ··· 5824 5823 cq_pkt->ctl = cpu_to_le32(tmp); 5825 5824 cq_pkt->value = cpu_to_le32(1); 5826 5825 5827 - if (!gaudi->multi_msi_mode) 5828 - msi_vec = 0; 5826 + if (gaudi->multi_msi_mode) 5827 + msi_addr = mmPCIE_MSI_INTR_0 + msi_vec * 4; 5828 + else 5829 + msi_addr = mmPCIE_CORE_MSI_REQ; 5829 5830 5830 - cq_pkt->addr = cpu_to_le64(CFG_BASE + mmPCIE_MSI_INTR_0 + msi_vec * 4); 5831 + cq_pkt->addr = cpu_to_le64(CFG_BASE + msi_addr); 5831 5832 } 5832 5833 5833 5834 static void gaudi_update_eq_ci(struct hl_device *hdev, u32 val)
+67 -48
drivers/misc/habanalabs/gaudi/gaudi_security.c
··· 8 8 #include "gaudiP.h" 9 9 #include "../include/gaudi/asic_reg/gaudi_regs.h" 10 10 11 - #define GAUDI_NUMBER_OF_RR_REGS 24 12 - #define GAUDI_NUMBER_OF_LBW_RANGES 12 11 + #define GAUDI_NUMBER_OF_LBW_RR_REGS 28 12 + #define GAUDI_NUMBER_OF_HBW_RR_REGS 24 13 + #define GAUDI_NUMBER_OF_LBW_RANGES 10 13 14 14 - static u64 gaudi_rr_lbw_hit_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = { 15 + static u64 gaudi_rr_lbw_hit_aw_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = { 16 + mmDMA_IF_W_S_SOB_HIT_WPROT, 15 17 mmDMA_IF_W_S_DMA0_HIT_WPROT, 16 18 mmDMA_IF_W_S_DMA1_HIT_WPROT, 19 + mmDMA_IF_E_S_SOB_HIT_WPROT, 17 20 mmDMA_IF_E_S_DMA0_HIT_WPROT, 18 21 mmDMA_IF_E_S_DMA1_HIT_WPROT, 22 + mmDMA_IF_W_N_SOB_HIT_WPROT, 19 23 mmDMA_IF_W_N_DMA0_HIT_WPROT, 20 24 mmDMA_IF_W_N_DMA1_HIT_WPROT, 25 + mmDMA_IF_E_N_SOB_HIT_WPROT, 21 26 mmDMA_IF_E_N_DMA0_HIT_WPROT, 22 27 mmDMA_IF_E_N_DMA1_HIT_WPROT, 23 28 mmSIF_RTR_0_LBW_RANGE_PROT_HIT_AW, ··· 43 38 mmNIF_RTR_7_LBW_RANGE_PROT_HIT_AW, 44 39 }; 45 40 46 - static u64 gaudi_rr_lbw_hit_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = { 41 + static u64 gaudi_rr_lbw_hit_ar_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = { 42 + mmDMA_IF_W_S_SOB_HIT_RPROT, 47 43 mmDMA_IF_W_S_DMA0_HIT_RPROT, 48 44 mmDMA_IF_W_S_DMA1_HIT_RPROT, 45 + mmDMA_IF_E_S_SOB_HIT_RPROT, 49 46 mmDMA_IF_E_S_DMA0_HIT_RPROT, 50 47 mmDMA_IF_E_S_DMA1_HIT_RPROT, 48 + mmDMA_IF_W_N_SOB_HIT_RPROT, 51 49 mmDMA_IF_W_N_DMA0_HIT_RPROT, 52 50 mmDMA_IF_W_N_DMA1_HIT_RPROT, 51 + mmDMA_IF_E_N_SOB_HIT_RPROT, 53 52 mmDMA_IF_E_N_DMA0_HIT_RPROT, 54 53 mmDMA_IF_E_N_DMA1_HIT_RPROT, 55 54 mmSIF_RTR_0_LBW_RANGE_PROT_HIT_AR, ··· 74 65 mmNIF_RTR_7_LBW_RANGE_PROT_HIT_AR, 75 66 }; 76 67 77 - static u64 gaudi_rr_lbw_min_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = { 68 + static u64 gaudi_rr_lbw_min_aw_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = { 69 + mmDMA_IF_W_S_SOB_MIN_WPROT_0, 78 70 mmDMA_IF_W_S_DMA0_MIN_WPROT_0, 79 71 mmDMA_IF_W_S_DMA1_MIN_WPROT_0, 72 + mmDMA_IF_E_S_SOB_MIN_WPROT_0, 80 73 mmDMA_IF_E_S_DMA0_MIN_WPROT_0, 81 74 mmDMA_IF_E_S_DMA1_MIN_WPROT_0, 75 + mmDMA_IF_W_N_SOB_MIN_WPROT_0, 82 76 mmDMA_IF_W_N_DMA0_MIN_WPROT_0, 83 77 mmDMA_IF_W_N_DMA1_MIN_WPROT_0, 78 + mmDMA_IF_E_N_SOB_MIN_WPROT_0, 84 79 mmDMA_IF_E_N_DMA0_MIN_WPROT_0, 85 80 mmDMA_IF_E_N_DMA1_MIN_WPROT_0, 86 81 mmSIF_RTR_0_LBW_RANGE_PROT_MIN_AW_0, ··· 105 92 mmNIF_RTR_7_LBW_RANGE_PROT_MIN_AW_0, 106 93 }; 107 94 108 - static u64 gaudi_rr_lbw_max_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = { 95 + static u64 gaudi_rr_lbw_max_aw_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = { 96 + mmDMA_IF_W_S_SOB_MAX_WPROT_0, 109 97 mmDMA_IF_W_S_DMA0_MAX_WPROT_0, 110 98 mmDMA_IF_W_S_DMA1_MAX_WPROT_0, 99 + mmDMA_IF_E_S_SOB_MAX_WPROT_0, 111 100 mmDMA_IF_E_S_DMA0_MAX_WPROT_0, 112 101 mmDMA_IF_E_S_DMA1_MAX_WPROT_0, 102 + mmDMA_IF_W_N_SOB_MAX_WPROT_0, 113 103 mmDMA_IF_W_N_DMA0_MAX_WPROT_0, 114 104 mmDMA_IF_W_N_DMA1_MAX_WPROT_0, 105 + mmDMA_IF_E_N_SOB_MAX_WPROT_0, 115 106 mmDMA_IF_E_N_DMA0_MAX_WPROT_0, 116 107 mmDMA_IF_E_N_DMA1_MAX_WPROT_0, 117 108 mmSIF_RTR_0_LBW_RANGE_PROT_MAX_AW_0, ··· 136 119 mmNIF_RTR_7_LBW_RANGE_PROT_MAX_AW_0, 137 120 }; 138 121 139 - static u64 gaudi_rr_lbw_min_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = { 122 + static u64 gaudi_rr_lbw_min_ar_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = { 123 + mmDMA_IF_W_S_SOB_MIN_RPROT_0, 140 124 mmDMA_IF_W_S_DMA0_MIN_RPROT_0, 141 125 mmDMA_IF_W_S_DMA1_MIN_RPROT_0, 126 + mmDMA_IF_E_S_SOB_MIN_RPROT_0, 142 127 mmDMA_IF_E_S_DMA0_MIN_RPROT_0, 143 128 mmDMA_IF_E_S_DMA1_MIN_RPROT_0, 129 + mmDMA_IF_W_N_SOB_MIN_RPROT_0, 144 130 mmDMA_IF_W_N_DMA0_MIN_RPROT_0, 145 131 mmDMA_IF_W_N_DMA1_MIN_RPROT_0, 132 + mmDMA_IF_E_N_SOB_MIN_RPROT_0, 146 133 mmDMA_IF_E_N_DMA0_MIN_RPROT_0, 147 134 mmDMA_IF_E_N_DMA1_MIN_RPROT_0, 148 135 mmSIF_RTR_0_LBW_RANGE_PROT_MIN_AR_0, ··· 167 146 mmNIF_RTR_7_LBW_RANGE_PROT_MIN_AR_0, 168 147 }; 169 148 170 - static u64 gaudi_rr_lbw_max_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = { 149 + static u64 gaudi_rr_lbw_max_ar_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = { 150 + mmDMA_IF_W_S_SOB_MAX_RPROT_0, 171 151 mmDMA_IF_W_S_DMA0_MAX_RPROT_0, 172 152 mmDMA_IF_W_S_DMA1_MAX_RPROT_0, 153 + mmDMA_IF_E_S_SOB_MAX_RPROT_0, 173 154 mmDMA_IF_E_S_DMA0_MAX_RPROT_0, 174 155 mmDMA_IF_E_S_DMA1_MAX_RPROT_0, 156 + mmDMA_IF_W_N_SOB_MAX_RPROT_0, 175 157 mmDMA_IF_W_N_DMA0_MAX_RPROT_0, 176 158 mmDMA_IF_W_N_DMA1_MAX_RPROT_0, 159 + mmDMA_IF_E_N_SOB_MAX_RPROT_0, 177 160 mmDMA_IF_E_N_DMA0_MAX_RPROT_0, 178 161 mmDMA_IF_E_N_DMA1_MAX_RPROT_0, 179 162 mmSIF_RTR_0_LBW_RANGE_PROT_MAX_AR_0, ··· 198 173 mmNIF_RTR_7_LBW_RANGE_PROT_MAX_AR_0, 199 174 }; 200 175 201 - static u64 gaudi_rr_hbw_hit_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = { 176 + static u64 gaudi_rr_hbw_hit_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 202 177 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_HIT_AW, 203 178 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_HIT_AW, 204 179 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_HIT_AW, ··· 225 200 mmNIF_RTR_CTRL_7_RANGE_SEC_HIT_AW 226 201 }; 227 202 228 - static u64 gaudi_rr_hbw_hit_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = { 203 + static u64 gaudi_rr_hbw_hit_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 229 204 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_HIT_AR, 230 205 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_HIT_AR, 231 206 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_HIT_AR, ··· 252 227 mmNIF_RTR_CTRL_7_RANGE_SEC_HIT_AR 253 228 }; 254 229 255 - static u64 gaudi_rr_hbw_base_low_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = { 230 + static u64 gaudi_rr_hbw_base_low_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 256 231 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_BASE_LOW_AW_0, 257 232 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_BASE_LOW_AW_0, 258 233 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_BASE_LOW_AW_0, ··· 279 254 mmNIF_RTR_CTRL_7_RANGE_SEC_BASE_LOW_AW_0 280 255 }; 281 256 282 - static u64 gaudi_rr_hbw_base_high_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = { 257 + static u64 gaudi_rr_hbw_base_high_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 283 258 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_BASE_HIGH_AW_0, 284 259 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_BASE_HIGH_AW_0, 285 260 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_BASE_HIGH_AW_0, ··· 306 281 mmNIF_RTR_CTRL_7_RANGE_SEC_BASE_HIGH_AW_0 307 282 }; 308 283 309 - static u64 gaudi_rr_hbw_mask_low_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = { 284 + static u64 gaudi_rr_hbw_mask_low_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 310 285 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_MASK_LOW_AW_0, 311 286 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_MASK_LOW_AW_0, 312 287 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_MASK_LOW_AW_0, ··· 333 308 mmNIF_RTR_CTRL_7_RANGE_SEC_MASK_LOW_AW_0 334 309 }; 335 310 336 - static u64 gaudi_rr_hbw_mask_high_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = { 311 + static u64 gaudi_rr_hbw_mask_high_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 337 312 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_MASK_HIGH_AW_0, 338 313 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_MASK_HIGH_AW_0, 339 314 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_MASK_HIGH_AW_0, ··· 360 335 mmNIF_RTR_CTRL_7_RANGE_SEC_MASK_HIGH_AW_0 361 336 }; 362 337 363 - static u64 gaudi_rr_hbw_base_low_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = { 338 + static u64 gaudi_rr_hbw_base_low_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 364 339 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_BASE_LOW_AR_0, 365 340 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_BASE_LOW_AR_0, 366 341 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_BASE_LOW_AR_0, ··· 387 362 mmNIF_RTR_CTRL_7_RANGE_SEC_BASE_LOW_AR_0 388 363 }; 389 364 390 - static u64 gaudi_rr_hbw_base_high_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = { 365 + static u64 gaudi_rr_hbw_base_high_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 391 366 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_BASE_HIGH_AR_0, 392 367 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_BASE_HIGH_AR_0, 393 368 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_BASE_HIGH_AR_0, ··· 414 389 mmNIF_RTR_CTRL_7_RANGE_SEC_BASE_HIGH_AR_0 415 390 }; 416 391 417 - static u64 gaudi_rr_hbw_mask_low_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = { 392 + static u64 gaudi_rr_hbw_mask_low_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 418 393 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_MASK_LOW_AR_0, 419 394 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_MASK_LOW_AR_0, 420 395 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_MASK_LOW_AR_0, ··· 441 416 mmNIF_RTR_CTRL_7_RANGE_SEC_MASK_LOW_AR_0 442 417 }; 443 418 444 - static u64 gaudi_rr_hbw_mask_high_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = { 419 + static u64 gaudi_rr_hbw_mask_high_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = { 445 420 mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_MASK_HIGH_AR_0, 446 421 mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_MASK_HIGH_AR_0, 447 422 mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_MASK_HIGH_AR_0, ··· 12874 12849 u32 lbw_rng_end[GAUDI_NUMBER_OF_LBW_RANGES]; 12875 12850 int i, j; 12876 12851 12877 - lbw_rng_start[0] = (0xFBFE0000 & 0x3FFFFFF) - 1; 12878 - lbw_rng_end[0] = (0xFBFFF000 & 0x3FFFFFF) + 1; 12852 + lbw_rng_start[0] = (0xFC0E8000 & 0x3FFFFFF) - 1; /* 0x000E7FFF */ 12853 + lbw_rng_end[0] = (0xFC11FFFF & 0x3FFFFFF) + 1; /* 0x00120000 */ 12879 12854 12880 - lbw_rng_start[1] = (0xFC0E8000 & 0x3FFFFFF) - 1; 12881 - lbw_rng_end[1] = (0xFC120000 & 0x3FFFFFF) + 1; 12855 + lbw_rng_start[1] = (0xFC1E8000 & 0x3FFFFFF) - 1; /* 0x001E7FFF */ 12856 + lbw_rng_end[1] = (0xFC48FFFF & 0x3FFFFFF) + 1; /* 0x00490000 */ 12882 12857 12883 - lbw_rng_start[2] = (0xFC1E8000 & 0x3FFFFFF) - 1; 12884 - lbw_rng_end[2] = (0xFC48FFFF & 0x3FFFFFF) + 1; 12858 + lbw_rng_start[2] = (0xFC600000 & 0x3FFFFFF) - 1; /* 0x005FFFFF */ 12859 + lbw_rng_end[2] = (0xFCC48FFF & 0x3FFFFFF) + 1; /* 0x00C49000 */ 12885 12860 12886 - lbw_rng_start[3] = (0xFC600000 & 0x3FFFFFF) - 1; 12887 - lbw_rng_end[3] = (0xFCC48FFF & 0x3FFFFFF) + 1; 12861 + lbw_rng_start[3] = (0xFCC4A000 & 0x3FFFFFF) - 1; /* 0x00C49FFF */ 12862 + lbw_rng_end[3] = (0xFCCDFFFF & 0x3FFFFFF) + 1; /* 0x00CE0000 */ 12888 12863 12889 - lbw_rng_start[4] = (0xFCC4A000 & 0x3FFFFFF) - 1; 12890 - lbw_rng_end[4] = (0xFCCDFFFF & 0x3FFFFFF) + 1; 12864 + lbw_rng_start[4] = (0xFCCE4000 & 0x3FFFFFF) - 1; /* 0x00CE3FFF */ 12865 + lbw_rng_end[4] = (0xFCD1FFFF & 0x3FFFFFF) + 1; /* 0x00D20000 */ 12891 12866 12892 - lbw_rng_start[5] = (0xFCCE4000 & 0x3FFFFFF) - 1; 12893 - lbw_rng_end[5] = (0xFCD1FFFF & 0x3FFFFFF) + 1; 12867 + lbw_rng_start[5] = (0xFCD24000 & 0x3FFFFFF) - 1; /* 0x00D23FFF */ 12868 + lbw_rng_end[5] = (0xFCD5FFFF & 0x3FFFFFF) + 1; /* 0x00D60000 */ 12894 12869 12895 - lbw_rng_start[6] = (0xFCD24000 & 0x3FFFFFF) - 1; 12896 - lbw_rng_end[6] = (0xFCD5FFFF & 0x3FFFFFF) + 1; 12870 + lbw_rng_start[6] = (0xFCD64000 & 0x3FFFFFF) - 1; /* 0x00D63FFF */ 12871 + lbw_rng_end[6] = (0xFCD9FFFF & 0x3FFFFFF) + 1; /* 0x00DA0000 */ 12897 12872 12898 - lbw_rng_start[7] = (0xFCD64000 & 0x3FFFFFF) - 1; 12899 - lbw_rng_end[7] = (0xFCD9FFFF & 0x3FFFFFF) + 1; 12873 + lbw_rng_start[7] = (0xFCDA4000 & 0x3FFFFFF) - 1; /* 0x00DA3FFF */ 12874 + lbw_rng_end[7] = (0xFCDDFFFF & 0x3FFFFFF) + 1; /* 0x00DE0000 */ 12900 12875 12901 - lbw_rng_start[8] = (0xFCDA4000 & 0x3FFFFFF) - 1; 12902 - lbw_rng_end[8] = (0xFCDDFFFF & 0x3FFFFFF) + 1; 12876 + lbw_rng_start[8] = (0xFCDE4000 & 0x3FFFFFF) - 1; /* 0x00DE3FFF */ 12877 + lbw_rng_end[8] = (0xFCE05FFF & 0x3FFFFFF) + 1; /* 0x00E06000 */ 12903 12878 12904 - lbw_rng_start[9] = (0xFCDE4000 & 0x3FFFFFF) - 1; 12905 - lbw_rng_end[9] = (0xFCE05FFF & 0x3FFFFFF) + 1; 12879 + lbw_rng_start[9] = (0xFCFC9000 & 0x3FFFFFF) - 1; /* 0x00FC8FFF */ 12880 + lbw_rng_end[9] = (0xFFFFFFFE & 0x3FFFFFF) + 1; /* 0x03FFFFFF */ 12906 12881 12907 - lbw_rng_start[10] = (0xFEC43000 & 0x3FFFFFF) - 1; 12908 - lbw_rng_end[10] = (0xFEC43FFF & 0x3FFFFFF) + 1; 12909 - 12910 - lbw_rng_start[11] = (0xFE484000 & 0x3FFFFFF) - 1; 12911 - lbw_rng_end[11] = (0xFE484FFF & 0x3FFFFFF) + 1; 12912 - 12913 - for (i = 0 ; i < GAUDI_NUMBER_OF_RR_REGS ; i++) { 12882 + for (i = 0 ; i < GAUDI_NUMBER_OF_LBW_RR_REGS ; i++) { 12914 12883 WREG32(gaudi_rr_lbw_hit_aw_regs[i], 12915 12884 (1 << GAUDI_NUMBER_OF_LBW_RANGES) - 1); 12916 12885 WREG32(gaudi_rr_lbw_hit_ar_regs[i], 12917 12886 (1 << GAUDI_NUMBER_OF_LBW_RANGES) - 1); 12918 12887 } 12919 12888 12920 - for (i = 0 ; i < GAUDI_NUMBER_OF_RR_REGS ; i++) 12889 + for (i = 0 ; i < GAUDI_NUMBER_OF_LBW_RR_REGS ; i++) 12921 12890 for (j = 0 ; j < GAUDI_NUMBER_OF_LBW_RANGES ; j++) { 12922 12891 WREG32(gaudi_rr_lbw_min_aw_regs[i] + (j << 2), 12923 12892 lbw_rng_start[j]); ··· 12958 12939 * 6th range is the host 12959 12940 */ 12960 12941 12961 - for (i = 0 ; i < GAUDI_NUMBER_OF_RR_REGS ; i++) { 12942 + for (i = 0 ; i < GAUDI_NUMBER_OF_HBW_RR_REGS ; i++) { 12962 12943 WREG32(gaudi_rr_hbw_hit_aw_regs[i], 0x1F); 12963 12944 WREG32(gaudi_rr_hbw_hit_ar_regs[i], 0x1D); 12964 12945 } 12965 12946 12966 - for (i = 0 ; i < GAUDI_NUMBER_OF_RR_REGS ; i++) { 12947 + for (i = 0 ; i < GAUDI_NUMBER_OF_HBW_RR_REGS ; i++) { 12967 12948 WREG32(gaudi_rr_hbw_base_low_aw_regs[i], dram_addr_lo); 12968 12949 WREG32(gaudi_rr_hbw_base_low_ar_regs[i], dram_addr_lo); 12969 12950
+2
drivers/misc/habanalabs/include/gaudi/asic_reg/gaudi_regs.h
··· 308 308 #define mmPCIE_AUX_FLR_CTRL 0xC07394 309 309 #define mmPCIE_AUX_DBI 0xC07490 310 310 311 + #define mmPCIE_CORE_MSI_REQ 0xC04100 312 + 311 313 #define mmPSOC_PCI_PLL_NR 0xC72100 312 314 #define mmSRAM_W_PLL_NR 0x4C8100 313 315 #define mmPSOC_HBM_PLL_NR 0xC74100
+1
drivers/nvmem/Kconfig
··· 109 109 110 110 config NVMEM_NINTENDO_OTP 111 111 tristate "Nintendo Wii and Wii U OTP Support" 112 + depends on WII || COMPILE_TEST 112 113 help 113 114 This is a driver exposing the OTP of a Nintendo Wii or Wii U console. 114 115
+14
include/linux/nvmem-consumer.h
··· 150 150 return -EOPNOTSUPP; 151 151 } 152 152 153 + static inline int nvmem_cell_read_variable_le_u32(struct device *dev, 154 + const char *cell_id, 155 + u32 *val) 156 + { 157 + return -EOPNOTSUPP; 158 + } 159 + 160 + static inline int nvmem_cell_read_variable_le_u64(struct device *dev, 161 + const char *cell_id, 162 + u64 *val) 163 + { 164 + return -EOPNOTSUPP; 165 + } 166 + 153 167 static inline struct nvmem_device *nvmem_device_get(struct device *dev, 154 168 const char *name) 155 169 {
+7
include/uapi/linux/android/binder.h
··· 225 225 226 226 struct binder_frozen_status_info { 227 227 __u32 pid; 228 + 229 + /* process received sync transactions since last frozen 230 + * bit 0: received sync transaction after being frozen 231 + * bit 1: new pending sync transaction during freezing 232 + */ 228 233 __u32 sync_recv; 234 + 235 + /* process received async transactions since last frozen */ 229 236 __u32 async_recv; 230 237 }; 231 238