1. 29 11月, 2020 2 次提交
    • A
      net: ipa: add support to code for IPA v4.5 · 8bfc4e21
      Alex Elder 提交于
      Update the IPA code to make use of the updated IPA v4.5 register
      definitions.  Generally what this patch does is, if IPA v4.5
      hardware is in use:
        - Ensure new registers or fields in IPA v4.5 are updated where
          required
        - Ensure registers or fields not supported in IPA v4.5 are not
          examined when read, or are set to 0 when written
      It does this while preserving the existing functionality for IPA
      versions lower than v4.5.
      
      The values to program for QSB_MAX_READS and QSB_MAX_WRITES and the
      source and destination resource counts are updated to be correct for
      all versions through v4.5 as well.
      
      Note that IPA_RESOURCE_GROUP_SRC_MAX and IPA_RESOURCE_GROUP_DST_MAX
      already reflect that 5 is an acceptable number of resources (which
      IPA v4.5 implements).
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      8bfc4e21
    • A
      net: ipa: add new most-significant bits to registers · 1af15c2a
      Alex Elder 提交于
      IPA v4.5 adds a few fields to the endpoint header and extended
      header configuration registers that represent new high-order bits
      for certain offsets and sizes.  Add code to incorporate these upper
      bits into the registers for IPA v4.5.
      
      This includes creating ipa_header_size_encoded(), which handles
      encoding the metadata offset field for use in the ENDP_INIT_HDR
      register in a way appropriate for the hardware version.  This and
      ipa_metadata_offset_encoded() ensure the mask argument passed to
      u32_encode_bits() is constant.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      1af15c2a
  2. 19 11月, 2020 2 次提交
    • A
      net: ipa: a few last IPA register cleanups · 716a115b
      Alex Elder 提交于
      Some last cleanups for the existing IPA register definitions:
        - Remove the definition of IPA_REG_ENABLED_PIPES_OFFSET, because
          it is not used.
        - Use "IPA_" instead of "BAM_" as the prefix on fields associated
          with the FLAVOR_0 register.  We use GSI (not BAM), but the
          fields apply to both GSI and BAM.
        - Get rid of the definition of IPA_CS_RSVD; it is never used.
        - Add two missing field mask definitions for the INIT_DEAGGR
          endpoint register.
        - Eliminate a few of the defined sequencer types, because they
          are unused.  We can add them back when needed.
        - Add a field mask to indicate which bit causes an interrupt on
          the microcontroller.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      716a115b
    • A
      net: ipa: support more versions for HOLB timer · 6833a096
      Alex Elder 提交于
      IPA version 3.5.1 represents the timer used in avoiding head-of-line
      blocking with a simple tick count.  IPA v4.2 changes that, instead
      splitting the timer field into two parts (base and scale) to
      represent the ticks in the timer period.
      
      IPA v4.0 and IPA v4.1 use the same method as IPA v3.5.1.  Change the
      test in ipa_reg_init_hol_block_timer_val() so the result is correct
      for those versions as well.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      6833a096
  3. 05 11月, 2020 1 次提交
    • A
      net: ipa: use version in gsi_channel_program() · ce54993d
      Alex Elder 提交于
      Use the IPA version in gsi_channel_program() to determine whether
      we should enable the GSI doorbell engine when requested.  This way,
      callers only say whether or not it should be enabled if needed,
      regardless of hardware version.
      
      Rename the "legacy" argument to gsi_channel_reset(), and have
      it indicate whether the doorbell engine should be enabled when
      reprogramming following the reset.
      
      Change all callers of gsi_channel_reset() to indicate whether to
      enable the doorbell engine after reset, independent of hardware
      version.
      
      Rework a little logic in ipa_endpoint_reset() to get rid of the
      "legacy" variable previously passed to gsi_channel_reset().
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      ce54993d
  4. 04 11月, 2020 1 次提交
  5. 31 10月, 2020 1 次提交
    • A
      net: ipa: assign endpoint to a resource group · 2d265342
      Alex Elder 提交于
      The IPA hardware manages various resources (e.g. descriptors)
      internally to perform its functions.  The resources are grouped,
      allowing different endpoints to use separate resource pools.  This
      way one group of endpoints can be configured to operate unaffected
      by the resource use of endpoints in a different group.
      
      Endpoints should be assigned to a resource group, but we currently
      don't do that.
      
      Define a new resource_group field in the endpoint configuration
      data, and use it to assign the proper resource group to use for
      each AP endpoint.
      Tested-by: NSujit Kautkar <sujitka@chromium.org>
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      2d265342
  6. 10 10月, 2020 1 次提交
    • A
      net: ipa: skip suspend/resume activities if not set up · d1704382
      Alex Elder 提交于
      When processing a system suspend request we suspend modem endpoints
      if they are enabled, and call ipa_cmd_tag_process() (which issues
      IPA commands) to ensure the IPA pipeline is cleared.  It is an error
      to attempt to issue an IPA command before setup is complete, so this
      is clearly a bug.  But we also shouldn't suspend or resume any
      endpoints that have not been set up.
      
      Have ipa_endpoint_suspend() and ipa_endpoint_resume() immediately
      return if setup hasn't completed, to avoid any attempt to configure
      endpoints or issue IPA commands in that case.
      
      Fixes: 84f9bd12 ("soc: qcom: ipa: IPA endpoints")
      Tested-by: NMatthias Kaehlcke <mka@chromium.org>
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      d1704382
  7. 29 9月, 2020 3 次提交
  8. 14 7月, 2020 1 次提交
    • A
      net: ipa: fix kerneldoc comments · e3eea08e
      Alex Elder 提交于
      This commit affects comments (and in one case, whitespace) only.
      
      Throughout the IPA code, return statements are documented using
      "@Return:", whereas they should use "Return:" instead.  Fix these
      mistakes.
      
      In function definitions, some parameters are missing their comment
      to describe them.  And in structure definitions, some fields are
      missing their comment to describe them.  Add these missing
      descriptions.
      
      Some arguments changed name and type along the way, but their
      descriptions were not updated (an endpoint pointer is now used in
      many places that previously used an endpoint ID).  Fix these
      incorrect parameter descriptions.
      
      In the description for the ipa_clock structure, one field had a
      semicolon instead of a colon in its description.  Fix this.
      
      Add a missing function description for ipa_gsi_endpoint_data_empty().
      
      All of these issues were identified when building with "W=1".
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e3eea08e
  9. 04 7月, 2020 1 次提交
    • A
      net: ipa: fix HOLB timer calculation · f13a8c31
      Alex Elder 提交于
      For IPA v4.2, the exact interpretation of the register that defines
      the timeout for avoiding head-of-line blocking was a little unclear.
      We're only assigning a 0 timeout to it right now, so that wasn't
      very important.  But now that I know how it's supposed to work, I'm
      fixing it.
      
      The register represents a tick counter, where each tick is equal to
      128 IPA core clock cycles.  For IPA v3.5.1, the register contains
      a simple counter value.  But for IPA v4.2, the register contains two
      fields, base and scale, which approximate the tick counter as:
          ticks = base << scale
      The base and scale values to use for a given tick count are computed
      using clever bit operations, and measures are taken to make the
      resulting time period as close as possible to that requested.
      
      There's no need for ipa_endpoint_init_hol_block_timer() to return
      an error, so change its return type to void.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f13a8c31
  10. 03 7月, 2020 4 次提交
  11. 02 7月, 2020 6 次提交
  12. 01 7月, 2020 1 次提交
  13. 12 6月, 2020 3 次提交
    • A
      net: ipa: header pad field only valid for AP->modem endpoint · f330fda3
      Alex Elder 提交于
      Only QMAP endpoints should be configured to find a pad size field
      within packet headers.  They are found in the first byte of the QMAP
      header (and the hardware fills only the 6 bits in that byte that
      constitute the pad_len field).
      
      The RMNet driver assumes the pad_len field is valid for received
      packets, so we want to ensure the pad_len field is filled in that
      case.  That driver also assumes the length in the QMAP header
      includes the pad bytes.
      
      The RMNet driver does *not* pad the packets it sends, so the pad_len
      field can be ignored.
      
      Fix ipa_endpoint_init_hdr_ext() so it only marks the pad field
      offset valid for QMAP RX endpoints, and in that case indicates
      that the length field in the header includes the pad bytes.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f330fda3
    • A
      net: ipa: program upper nibbles of sequencer type · 636edeaa
      Alex Elder 提交于
      The upper two nibbles of the sequencer type were not used for
      SDM845, and were assumed to be 0.  But for SC7180 they are used, and
      so they must be programmed by ipa_endpoint_init_seq().  Fix this bug.
      
      IPA_SEQ_PKT_PROCESS_NO_DEC_NO_UCP_DMAP doesn't have a descriptive
      comment, so add one.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      636edeaa
    • A
      net: ipa: program metadata mask differently · 8730f45d
      Alex Elder 提交于
      The way the mask value is programmed for QMAP RX endpoints was based
      on some wrong assumptions about the way metadata containing the QMAP
      mux_id value is formatted.  The metadata value supplied by the
      modem is *not* in QMAP format, and in fact contains the mux_id we
      want in its (big endian) low-order byte.  That byte must be written
      by the IPA into offset 1 of the QMAP header it inserts before the
      received packet.
      
      QMAP TX endpoints *do* use a QMAP header as the metadata sent with
      each packet.  The modem assumes this, and based on that assumes the
      mux_id is in the second byte.  To match those assumptions we must
      program the modem TX (QMAP) endpoint HDR register to indicate the
      metadata will be found at offset 0 in the message header.
      
      The previous configuration managed to work, but it was not working
      correctly.  This patch fixes a bug whose symptom was receipt of
      messages containing the wrong QMAP mux_id.
      
      In fixing this, get rid of ipa_rmnet_mux_id_metadata_mask(), which
      was more or less defined so there was a separate place to explain
      what was happening as we generated the mask value.  Instead, put a
      longer description of how this works above ipa_endpoint_init_hdr(),
      and define the metadata mask to use as a simple constant.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      8730f45d
  14. 28 5月, 2020 1 次提交
  15. 09 5月, 2020 1 次提交
    • N
      net: ipa: Remove ipa_endpoint_stop{,_rx_dma} again · b5c3babb
      Nathan Chancellor 提交于
      When building arm64 allyesconfig:
      
      drivers/net/ipa/ipa_endpoint.c: In function 'ipa_endpoint_stop_rx_dma':
      drivers/net/ipa/ipa_endpoint.c:1274:13: error: 'IPA_ENDPOINT_STOP_RX_SIZE' undeclared (first use in this function)
      drivers/net/ipa/ipa_endpoint.c:1274:13: note: each undeclared identifier is reported only once for each function it appears in
      drivers/net/ipa/ipa_endpoint.c:1289:2: error: implicit declaration of function 'ipa_cmd_dma_task_32b_addr_add' [-Werror=implicit-function-declaration]
      drivers/net/ipa/ipa_endpoint.c:1291:45: error: 'ENDPOINT_STOP_DMA_TIMEOUT' undeclared (first use in this function)
      drivers/net/ipa/ipa_endpoint.c: In function 'ipa_endpoint_stop':
      drivers/net/ipa/ipa_endpoint.c:1309:16: error: 'IPA_ENDPOINT_STOP_RX_RETRIES' undeclared (first use in this function)
      
      These functions were removed in a series, merged in as
      commit 33395f4a ("Merge branch 'net-ipa-kill-endpoint-stop-workaround'").
      
      Remove them again so that the build works properly.
      
      Fixes: 3793faad ("Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net")
      Signed-off-by: NNathan Chancellor <natechancellor@gmail.com>
      Reviewed-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      b5c3babb
  16. 07 5月, 2020 8 次提交
    • A
      net: ipa: kill ipa_endpoint_stop() · f30dcb7d
      Alex Elder 提交于
      The previous commit made ipa_endpoint_stop() be a trivial wrapper
      around gsi_channel_stop().  Since it no longer does anything
      special, just open-code it in the three places it's used.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f30dcb7d
    • A
      net: ipa: don't retry in ipa_endpoint_stop() · 9928fcc7
      Alex Elder 提交于
      The only reason ipa_endpoint_stop() had a retry loop was that the
      just-removed workaround required an IPA DMA command to occur between
      attempts.  The gsi_channel_stop() call that implements the stop does
      its own retry loop, to cover a channel's transition from started to
      stop-in-progress to stopped state.
      
      Get rid of the unnecessary retry loop in ipa_endpoint_stop().
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      9928fcc7
    • A
      net: ipa: get rid of workaround in ipa_endpoint_stop() · c72ddf0d
      Alex Elder 提交于
      In ipa_endpoint_stop(), a workaround is used for IPA version 3.5.1
      where a 1-byte DMA request is issued between GSI channel stop
      retries.
      
      It turns out that this workaround is only required for IPA versions
      3.1 and 3.2, and we don't support those.  So remove the call to
      ipa_endpoint_stop_rx_dma() in that function.  That leaves that
      function unused, so get rid of it.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c72ddf0d
    • A
      net: ipa: fix a bug in ipa_endpoint_stop() · 97e4692d
      Alex Elder 提交于
      In ipa_endpoint_stop(), for TX endpoints we set the number of retries
      to 0.  When we break out of the loop, retries being 0 means we return
      EIO rather than the value of ret (which should be 0).
      
      Fix this by using a non-zero retry count for both RX and TX
      channels, and just break out of the loop after calling
      gsi_channel_stop() for TX channels.  This way only RX channels
      will retry, and the retry count will be non-zero at the end
      for TX channels (so the proper value gets returned).
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      (cherry picked from commit 713b6ebb)
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      97e4692d
    • A
      net: ipa: remove endpoint delay mode feature · a4dcad34
      Alex Elder 提交于
      A "delay mode" feature was put in place to work around a problem
      that was observed during development of the upstream IPA driver.  It
      used TX endpoint "delay mode" in order to prevent transmitting
      packets toward the modem before it was ready.
      
      A race condition that would explain the problem has long since been
      fixed, and we have concluded that the "delay mode" feature is no
      longer required.  So get rid of it.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      a4dcad34
    • A
      net: ipa: introduce ipa_endpoint_program_suspend() · 4fa95248
      Alex Elder 提交于
      Create a new helper function that encapsulates enabling or disabling
      suspend on an RX endpoint.  It returns the previous state of the
      endpoint (true means suspend mode was enabled).
      
      Create another function that handles enabling or disabling delay mode
      on a TX endpoint.  Delay mode does not work correctly on IPA version
      4.2, so we don't currently use it (and shouldn't).
      
      We only set delay mode in one case, and although we don't expect an
      endpoint to already be in delay mode, it doesn't really matter if it
      was.  So the delay function doesn't return a value.
      
      Stop issuing warnings if the previous suspend or delay mode state
      differs from what is expected.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      4fa95248
    • A
      net: ipa: have ipa_endpoint_init_ctrl() return previous state · 4900bf34
      Alex Elder 提交于
      Change ipa_endpoint_init_ctrl() so it returns the previous state
      (whether suspend or delay mode was enabled) rather than indicating
      whether the request caused a change in state.  This makes it easier
      to understand what's happening where called.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      4900bf34
    • A
      net: ipa: rename db_enable flag · f86a1909
      Alex Elder 提交于
      In several places, a Boolean flag is used in the GSI code to
      indicate whether the "doorbell engine" should be enabled or not
      when a channel is configured.  This is basically done to abstract
      this property from the IPA version; the GSI code doesn't otherwise
      "know" what the IPA hardware version is.  The doorbell engine is
      enabled only for IPA v3.5.1, not for IPA v4.0 and later.
      
      The next patch makes another change that affects behavior during
      channel reset (which also involves programming the channel).  It
      also distinguishes IPA v3.5.1 hardware from newer hardware.
      
      Rather than creating another flag whose value matches the "db_enable"
      value, just rename "db_enable" to be "legacy" so it can be used to
      signal more than just the special doorbell handling.
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f86a1909
  17. 01 5月, 2020 1 次提交
    • A
      net: ipa: fix a bug in ipa_endpoint_stop() · 713b6ebb
      Alex Elder 提交于
      In ipa_endpoint_stop(), for TX endpoints we set the number of retries
      to 0.  When we break out of the loop, retries being 0 means we return
      EIO rather than the value of ret (which should be 0).
      
      Fix this by using a non-zero retry count for both RX and TX
      channels, and just break out of the loop after calling
      gsi_channel_stop() for TX channels.  This way only RX channels
      will retry, and the retry count will be non-zero at the end
      for TX channels (so the proper value gets returned).
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      713b6ebb
  18. 22 3月, 2020 1 次提交
    • A
      soc: qcom: ipa: kill IPA_RX_BUFFER_ORDER · 6fcd4224
      Alex Elder 提交于
      Don't assume the receive buffer size is a power-of-2 number of pages.
      Instead, define the receive buffer size independently, and then
      compute the page order from that size when needed.
      
      This fixes a build problem that arises when the ARM64_PAGE_SHIFT
      config option is set to have a page size greater than 4KB.  The
      problem was identified by Linux Kernel Functional Testing.
      
      The IPA code basically assumed the page size to be 4KB.  A larger page
      size caused the receive buffer size to become correspondingly larger
      (32KB or 128KB for ARM64_16K_PAGES and ARM64_64K_PAGES, respectively).
      The receive buffer size is used to compute an "aggregation byte limit"
      value that gets programmed into the hardware, and the large page sizes
      caused that limit value to be too big to fit in a 5 bit field.  This
      triggered a BUILD_BUG_ON() call in ipa_endpoint_validate_build().
      
      This fix causes a lot of receive buffer memory to be wasted if
      system is configured for page size greater than 4KB.  But such a
      misguided configuration will now build successfully.
      Reported-by: NNaresh Kamboju <naresh.kamboju@linaro.org>
      Signed-off-by: NAlex Elder <elder@linaro.org>
      Reviewed-by: NBjorn Andersson <bjorn.andersson@linaro.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      6fcd4224
  19. 20 3月, 2020 1 次提交